3

I have an iPad popover and would like to present (point) to one segment in a segmented control. The code below works fine except the pointer points to the middle of the segmented control - I would prefer it points to the correct segment. ie segment 0 or segment 1.

if (UI_USER_INTERFACE_IDIOM() == UIUserInterfaceIdiomPad) {
   [printController presentFromBarButtonItem:self.navigationItem.rightBarButtonItem animated:YES completionHandler:completionHandler];// iPad
}

Many thanks.

Atulkumar V. Jain
  • 5,102
  • 9
  • 44
  • 61
Magnus
  • 425
  • 1
  • 5
  • 13

3 Answers3

5

Code below may be useful for pointing popover to selected tab in segment control.

CGRect frame = [segmentControl frame];
frame =CGRectMake((frame.size.width/No. of segments * [segmentControl selectedSegmentIndex]), 0, frame.size.width/No. of segments, segmentControl.bounds.size.height);

[m_PopOver presentPopoverFromRect:frame inView:segmentControl permittedArrowDirections:UIPopoverArrowDirectionAny animated:YES];
Ameer
  • 705
  • 8
  • 18
0

Updated for Swift 3.0

var frame = segmentedControl.frame
frame = CGRect(x: frame.size.width/CGFloat(segmentedControl.numberOfSegments) * CGFloat(segmentedControl.selectedSegmentIndex),
               y: 0,
               width: frame.size.width/CGFloat(segmentedControl.numberOfSegments),
               height: segmentedControl.bounds.size.height)


popoverController?.sourceRect = frame
Adrian
  • 16,233
  • 18
  • 112
  • 180
0

Try something like this (replace desiredSegmentIndex with the index of the segment the arrow should point to):

CGFloat desiredOffset = 0;
for (NSUInteger segmentIndex = 0; segmentIndex < desiredSegmentIndex; segmentIndex ++)
    desiredOffset += [segmentedControl widthForSegmentAtIndex:segmentIndex];
[printController presentFromRect:CGRectMake(desiredOffset, 0, [segmentedControl widthForSegmentAtIndex:desiredSegmentIndex], segmentedControl.bounds.size.height);
                          inView:segmentedControl
                        animated:YES
               completionHandler:completionHandler];

I have not tested this, but it (or something very similar) should work.

MrMage
  • 7,282
  • 2
  • 41
  • 71