内容插入如何影响布局

时间:2013-09-11 12:52:57

标签: ios uiscrollview autolayout

在使用UIScrollView时,我注意到一些关于自动布局和内容插入的奇怪行为;以下面的代码为例:

- (void) loadView
{
  UIScrollView * scroller = [[UIScrollView alloc] init];
  scroller.backgroundColor = [UIColor orangeColor];

  UILabel * label = [[UILabel alloc] init];
  label.backgroundColor = [UIColor blueColor];
  label.translatesAutoresizingMaskIntoConstraints = NO;
  [scroller addSubview:label];

  [scroller addConstraint: [NSLayoutConstraint constraintWithItem:label attribute:NSLayoutAttributeLeft relatedBy:NSLayoutRelationEqual toItem:scroller attribute:NSLayoutAttributeLeft multiplier:1.0 constant:40]];
  [scroller addConstraint: [NSLayoutConstraint constraintWithItem:label attribute:NSLayoutAttributeTop relatedBy:NSLayoutRelationEqual toItem:scroller attribute:NSLayoutAttributeTop multiplier:1.0 constant:20]];
  [scroller addConstraint: [NSLayoutConstraint constraintWithItem:label attribute:NSLayoutAttributeWidth relatedBy:NSLayoutRelationEqual toItem:nil attribute:NSLayoutAttributeNotAnAttribute multiplier:1.0 constant:240]];
  [scroller addConstraint: [NSLayoutConstraint constraintWithItem:label attribute:NSLayoutAttributeHeight relatedBy:NSLayoutRelationEqual toItem:nil attribute:NSLayoutAttributeNotAnAttribute multiplier:1.0 constant:44]];

  self.view = scroller;
  scroller.contentInset = UIEdgeInsetsMake(44, 0, 0, 0);  //this is the game changer
}

如果没有更改内容插入的最后一行,则UILabel按预期位于(40,20)。当改变内容插入时,标签移动到(40,108),而不是(40,64);顶部内容插入以某种方式加倍。 如果UILabel是使用set frame创建的,并且没有这些约束:

- (void) loadView
{
  UIScrollView * scroller = [[UIScrollView alloc] init];
  scroller.backgroundColor = [UIColor orangeColor];

  CGRect frame = CGRectMake(40, 20, 240, 44);
  UILabel * label = [[UILabel alloc] initWithFrame:frame];
  label.backgroundColor = [UIColor blueColor];
  [scroller addSubview:label];

  self.view = scroller;
  scroller.contentInset = UIEdgeInsetsMake(44, 0, 0, 0);
}

然后它的行为符合预期(40,20)和(40,64),具体取决于内容插入。

我检查了文件并试图翻转一些开关,但仍然无法找出原因。

顺便说一句,这是IOS(6)模拟器的结果,我还没有在设备上试过它。

P.S。 除了新状态栏行为的差异外,事情在IOS7的模拟器上显示为预期。

0 个答案:

没有答案