SegmentedControl 在模拟器上 运行 时更改位置

SegmentedControl changes position when run on simulator

我有一个 UISegmentedControl,我正在尝试设置每个 segment 的宽度。下面的代码不应该改变任何东西,但它确实改变了。这是代码:

viewDidApear

NSLog(@"%f", self.segment.frame.size.width); // 369

CGFloat segmentWidth = self.segment.frame.size.width;
NSUInteger firstAndLastSegmentWidth = [self.segment widthForSegmentAtIndex:0] + [self.segment widthForSegmentAtIndex:4];

[self.segment setWidth:(segmentWidth - firstAndLastSegmentWidth) / 3 forSegmentAtIndex:1];
[self.segment setWidth:(segmentWidth - firstAndLastSegmentWidth) / 3  forSegmentAtIndex:2];
[self.segment setWidth:(segmentWidth - firstAndLastSegmentWidth) / 3 forSegmentAtIndex:3];

// Note: The following code does not do anything:
CGRect viewFrame = self.segment.frame;
viewFrame.origin.x = self.thirdCell.frame.origin.x - 30;
self.segment.frame = viewFrame;

NSLog(@"%f", self.segment.frame.size.width); // 369

故事板:

NSLayoutConstraints:

模拟器:

第一张图是上面代码执行的时候。第二张图是去掉上面的代码后的。

请注意图像右侧,当代码执行时(第一张图像),宽度似乎发生了变化。但是当我在设置段宽度之前和之后执行 NSLog 宽度时,它们显示相同的结果。

我的问题是,当我 运行 上面的代码时,如何让 segmentedControl 不改变它的外观?

设置段的宽度确实会改变分段控件的可见大小,但不会改变控件的实际大小。您可以通过在代码中除以 5 而不是 3 来看到这一点,并且您会看到控件 看起来 小得多,但是如果您单击最后一段的右侧,您将看到它选择了它(如果您为控件提供背景颜色,它会扩展到由其约束定义的控件的完整大小)。至于为什么数学不起作用,我认为这是因为分隔符。如果您为每个分隔符减去 1(在您的情况下为 4),您应该得到正确的大小。

- (void)viewDidAppear:(BOOL)animated {
    [super viewDidAppear:animated];
    CGFloat segmentWidth = self.segment.frame.size.width;
    NSUInteger firstAndLastSegmentWidth = [self.segment widthForSegmentAtIndex:0] + [self.segment widthForSegmentAtIndex:4];
    NSInteger sepWidths = self.segment.numberOfSegments - 1;
    [self.segment setWidth:(segmentWidth - firstAndLastSegmentWidth - sepWidths) / 3 forSegmentAtIndex:1];
    [self.segment setWidth:(segmentWidth - firstAndLastSegmentWidth - sepWidths) / 3  forSegmentAtIndex:2];
    [self.segment setWidth:(segmentWidth - firstAndLastSegmentWidth - sepWidths) / 3 forSegmentAtIndex:3];
}