【问题标题】:SegmentedControl changes position when run on simulatorSegmentedControl 在模拟器上运行时改变位置
【发布时间】:2023-04-10 06:33:02
【问题描述】:

我有一个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 不改变其外观?

【问题讨论】:

  • 除了丢失的灰色条(不管是什么),这两个模拟器图像看起来和我一模一样。我也不明白你的问题;如果你不想让代码改变外观,那你为什么要运行代码呢?
  • 如果您放大近看,您会看到在第二张图片中,segmentedControl 有点小。我必须运行该代码,因为我将添加段,然后更改它们的大小。为了简化事情,我只是发布了最简单的代码,以显示问题所在
  • 灰色条是模拟器的影子
  • 当您添加或删除段时,seqments 自然是相等的。你不应该调整宽度,除非你故意在最左边和最右边有一个非常薄的“空”段。

标签: ios objective-c uisegmentedcontrol nslayoutconstraint


【解决方案1】:

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2014-11-29
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-01-04
    • 1970-01-01
    • 2016-07-23
    相关资源
    最近更新 更多