如何从 UISegmentedControl 的选定段呈现 UIPopover

Posted

技术标签:

【中文标题】如何从 UISegmentedControl 的选定段呈现 UIPopover【英文标题】:How to present UIPopover from selected segment of UISegmentedControl 【发布时间】:2013-09-26 08:07:11 【问题描述】:

我需要从 UISegmentedControl 的选定片段中显示弹出框,该片段是 UIToolBar 的子视图。 这是我的代码:

// UISegemntedControl
NSArray *segments = [NSArray arrayWithObjects:@"one", @"two", @"three", nil];
_segmentedControl = [[UISegmentedControl alloc] initWithItems:segments];
_segmentedControl.frame = CGRectMake(self.frame.size.width/2-128, self.frame.size.height/2-12, 256, 24);
_segmentedControl.selectedSegmentIndex = 0;
[self addSubview:_segmentedControl];

显示弹出框:

- (void)show

UIView *view = [toolBar.segmentedControl.subviews objectAtIndex:toolBar.segmentedControl.selectedSegmentIndex];

// UIPopoverController
[popover presentPopoverFromRect:view.bounds inView:view permittedArrowDirections:UIPopoverArrowDirectionAny animated:YES];

它有效,但每次弹出框都来自错误的片段。不知道为什么……

更新: 解决方案:

float width = toolBar.segmentedControl.frame.size.width/toolBar.segmentedControl.subviews.count;
CGRect bounds = CGRectMake(toolBar.segmentedControl.frame.origin.x+width*toolBar.segmentedControl.selectedSegmentIndex, toolBar.segmentedControl.frame.origin.y, width, toolBat.segmentedControl.frame.size.height);
...
[popover presentPopoverFromRect:bounds inView:toolBar permittedArrowDirections:UIPopoverArrowDirectionAny animated:YES];

【问题讨论】:

【参考方案1】:

如果段相等,您只需将控件的宽度除以所选段的数量即可。

 if ((UISegmentedControl*)sender.selectedSegmentIndex == 0)
        [self.popover presentPopoverFromRect:CGRectMake(self.segmentedControl.frame.size.width/3, self.segmentedControl.frame.origin.y, aWidth, aHeight)];

参考一下 Get frame from certain UISegmentedControl index

【讨论】:

这是解决方案。谢谢。

以上是关于如何从 UISegmentedControl 的选定段呈现 UIPopover的主要内容,如果未能解决你的问题,请参考以下文章

从 UISegmentedControl 获取字符串值

如何将可扩展列表视图的选定子视图数据从片段发送到父活动?

从 UITableView didSelectRowAtIndexPath 检测 UISegmentedControl 中的选择更改

如何使 UISegmentedcontrol 透明?

iOS 13 - UISegmentedControl - 如何更改 selectedSegment 的圆角半径?

如何检查用户是不是选择了 UISegmentedControl?