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

时间:2015-05-20 00:51:59

标签: ios objective-c uisegmentedcontrol nslayoutconstraint

我有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

故事板: enter image description here

NSLayoutConstraints:

enter image description here

模拟器:

第一张图片是执行上述代码的时间。第二张图片是删除上述代码的时间。

注意图像右侧的所有方式,当代码执行时(第一张图像),宽度似乎已经改变。但是当我设置宽度NSLog时,在设置分段宽度之前和之后,它们会显示相同的结果。

我的问题是,如何让segmentedControl不要更改其'当我运行上面的代码时出现?

1 个答案:

答案 0 :(得分:0)

设置段的宽度确实会改变分段控件的可见大小,但不会改变控件的实际大小。您可以在代码中除以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];
}
相关问题