有没有办法在UISegmentedControl中获得与内容成比例的段的宽度?

问题描述 投票:0回答:2

UISegmentedControl中的段与内容成比例的情况下,当从widthForSegmentAtIndex调用时,viewDidLayoutSubviews似乎返回0。无论如何要获得实际宽度? (我正在使用自动布局。)

如果没有,是否有任何方法可以获得与段相对应的子视图? segmentedControl.subviews[index]不能可靠地工作。

如果没有办法做到这一点是否可以使用UISegmentedControl的替代品?

谢谢!

ios objective-c ios9
2个回答
1
投票

从我的测试来看,无论每个细分的文本大小如何,细分的宽度似乎总是相等的。

CGFloat segmentWidth = segmentedControl.frame.size.width / segmentedControl.numberOfSegments;

编辑

不幸的是,如果segmentedControl使用apportionsSegmentWidthsByContent,则上述答案不起作用。在这种情况下,我找不到一种简单的方法来获得段的宽度。

但是,您可以手动获取您感兴趣的段的文本,然后计算它应该有多长(取决于您想要在两侧填充多少),然后使用该数字并使用setWidth:forSegmentAtIndex:方法设置段到计算的宽度,那么你肯定知道段的宽度。


0
投票

以下类别使NSSegmentedControl能够告诉您计算的段宽度。这不完美 - 请参阅评论中的免责声明。

@implementation NSSegmentedControl (SegmentedControlWidthComputation)
/* Note: This implementation doesn't properly handle cells with images. It also makes some guesses about AppKit's behavior, and should be treated as an estimation rather than an exact value. */
- (CGFloat)computedWidthForSegment:(NSInteger)SEGIDX
{
    CGFloat pad = 0;
    switch (self.controlSize) {
        case (NSControlSizeMini): pad = 16; break;
        case (NSControlSizeSmall): pad = 22; break;
        case (NSControlSizeRegular): pad = 28; break;
    }

    return [[NSAttributedString alloc] initWithString:[self labelForSegment:SEGIDX] attributes:@{NSFontAttributeName:self.font}].size.width + pad;
}
@end
© www.soinside.com 2019 - 2024. All rights reserved.