2

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,082
  • 9
  • 43
  • 61
Magnus
  • 265
  • 1
  • 4
  • 12

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
  • 625
  • 7
  • 17
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
  • 15,330
  • 17
  • 106
  • 173
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,121
  • 2
  • 36
  • 67