从某些UISegmentedControl索引获取帧?
在我的应用程序中,我使用UIPopoverController并使用presentPopoverFromRect
API。 我现在正在做的只是将它设置为我整个UISegmentedControl的框架。 但是我希望比这更精确。 有没有办法在UISegmentedControl中获取特定索引的框架?
谢谢!
如果段相等,为什么不将控件的宽度除以所选段的数量(+1因为编号从0开始)? 编辑:像这样
-(void)showPopover:(id)sender { if ((UISegmentedControl*)sender.selectedSegmentIndex == 0) [self.popover presentPopoverFromRect:CGRectMake(self.segmentedControl.frame.size.width/6, self.segmentedControl.frame.origin.y, aWidth, aHeight)] }
它超过6(我假设有一个3段实现),因为你必须获得段的中心,3将它放在线上。 如果你在这里做一些简单的数学运算(假设整个控制范围是60 px宽),那么60/3 yeilds 20.因为每个段的宽度为20 px,60的宽度超过6会产生正确的答案10。
对于我们的项目,我们需要每个段的实际帧,帧划分是不够的。 这是我写的一个函数,它计算每个段的确切帧。 请注意,它会访问分段控件实际子视图,因此它可能会在任何iOS更新中中断。
- (CGRect)segmentFrameForIndex:(NSInteger)index inSegmentedControl:(UISegmentedControl *)control { // WARNING: This function gets frame from UISegment objects, undocumented subviews of UISegmentedControl. // May break in iOS updates. NSMutableArray *segments = [NSMutableArray arrayWithCapacity:self.numberOfSegments]; for (UIView *view in control.subviews) { if ([NSStringFromClass([view class]) isEqualToString:@"UISegment"]) { [segments addObject:view]; } } NSArray *sorted = [segments sortedArrayUsingComparator:^NSComparisonResult(UIView *a, UIView *b) { if (a.frame.origin.x < b.frame.origin.x) { return NSOrderedAscending; } else if (a.frame.origin.x > b.frame.origin.x) { return NSOrderedDescending; } return NSOrderedSame; }]; return [[sorted objectAtIndex:index] frame]; }
如果不使用自定义分段控件(Swift版本),则可以更轻松地完成此操作而无需匹配类名
extension NSSegmentedControl { func frameForSegment(segment: Int) -> NSRect { var left : CGFloat = 0 for i in 0..
如果有人正在寻找NSSegmentedControl
的解决方案,我稍微修改了@ erik-aigner的答案。 对于UISegmentedControl
它的工作方式应该类似。
此版本通常改进了间距和代码的几何计算。 免责声明:它仅针对放置在工具栏中的分段控件进行了测试。
import AppKit public extension NSSegmentedControl { /// The width of a single horizontal border. public static let horizontalBorderWidth: CGFloat = 3 /// The height of a single vertical border. public static let verticalBorderWidth: CGFloat = 2 /// The horizontal spacing between segments. public static let horizontalSegmentSpacing: CGFloat = 1 /// Returns the frame of the specified segment. /// /// - Parameter segment: The index of the segment whose frame should be computed. /// - Returns: The frame of the segment or `.zero` if an invalid segment index is passed in. public func frame(forSegment segment: Int) -> NSRect { let y = bounds.minY - NSSegmentedControl.verticalBorderWidth let height = bounds.height var left = NSSegmentedControl.horizontalBorderWidth for index in 0..
- iOS 8.0中的UISearchBar barTintColor clearColor错误
- 当用户使用滑动手势对其进行编辑时,如何离开UITableViewCellEditingStyleDelete模式
- 如何在UIDatePickerView中隐藏未来或过去的date
- 有没有可能在UITableView中更改字体的types和大小?
- 添加barButtonItems到一个没有导航控制器的UINavigationBar
- 备用语言iOS(带有不完整的Localizable.strings文件)
- 只绘制一个uilabel的顶部,右侧和底部边框
- 不能在swift中转换AnyHashable 3
- 如何在UISegmentedControl中仅显示所选项目的底部边框?