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];
}
我有一个 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];
}