从某些UISegmentedControl索引获取帧?

Sim*_*iwi 5 frame uisegmentedcontrol ipad ios

在我的应用程序中,我使用UIPopoverController并使用presentPopoverFromRectAPI.我现在正在做的只是将它设置为我整个UISegmentedControl的框架.但是我希望比这更精确.有没有办法在UISegmentedControl中获取特定索引的框架?

谢谢!

Acc*_*yyc 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];
}
Run Code Online (Sandbox Code Playgroud)


Cod*_*aFi 5

如果段相等,为什么不将控件的宽度除以所选段的数量(+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)]
}
Run Code Online (Sandbox Code Playgroud)

它超过6(我假设有一个3段实现),因为你必须获得段的中心,3将把它放在线上.如果你在这里做一些简单的数学运算(让我们假设整个控制是60 px宽),那么60/3 yeilds 20.因为每个段的宽度为20 px,所以60的宽度超过6会产生正确的答案10.