iOS 11中具有自动布局的程序化UIScrollview

我已经仔细阅读了Apple在UIScrollView上的文档,尤其是它如何与auto layout ,我更喜欢编程路径。 我将演示UIScrollViews的“混合”和“纯”自动布局方法。

您是否知道UIScrollView类通过更改其边界的原点来滚动其内容? 酷吧!

滚动视图的子视图上的约束必须导致要填充的大小,然后将其解释为滚动视图的内容大小。 (这不应与用于“自动布局”的“ internalContentSize”方法混淆。)要使用“自动布局”来调整滚动视图的框架大小,必须明确规定滚动视图的宽度和高度,或者必须将滚动视图的边缘设为绑定到其子树之外的视图。请注意,可以通过在视图和滚动视图的子树外部的视图(例如,滚动)之间创建约束,使滚动视图的子视图看起来漂浮(而不滚动)在其他滚动内容上视图的超级视图。

这是两个如何配置滚动​​视图的示例,首先是混合方法,然后是纯方法。

混合方式

使用滚动视图外部的约束来确定滚动视图的位置和大小,即,translatesAutoresizingMaskIntoConstraints属性设置为NO。

为滚动视图创建一个普通的UIView内容视图,该视图将是您希望内容具有的大小。 使它成为滚动视图的子视图,但让它继续将自动调整大小蒙版转换为约束:

清单1混合方法代码清单

  -(void) viewDidLoad { 
UIView * contentView;
contentView = [[UIView alloc] initWithFrame:CGRectMake(0,0,contentWidth,contentHeight)];
[scrollView addSubview:contentView];
//请勿更改contentView的translationsAutoresizingMaskIntoConstraints,默认情况下为YES;
  //设置滚动视图的内容大小以匹配内容视图的大小: 
[scrollView setContentSize:CGSizeMake(contentWidth,contentHeight)];
  / *其余代码在这里... * / 
}

创建要放入内容视图中的视图并配置其约束,以便将其放置在内容视图中。

另外,您可以创建一个视图子树以进入滚动视图,设置约束,然后调用systemLayoutSizeFittingSize:方法(带有UILayoutFittingCompressedSize选项)以找到要用于内容视图的大小以及该视图的contentSize属性。滚动视图。

纯自动布局方法

要使用纯自动布局方法,请执行以下操作:

  • 在所有涉及的视图上将translatesAutoresizingMaskIntoConstraints设置为NO。
  • 使用滚动视图外部的约束来定位和调整滚动视图的大小。
  • 使用约束在滚动视图中布置子视图,确保约束与滚动视图的所有四个边缘相关联,并且不依赖于滚动视图来获取其大小。

一个简单的示例是大型图像视图,该视图具有从图像大小得出的固有内容大小。 在视图控制器的viewDidLoad方法中,您将包含类似于以下清单所示代码的代码:

清单2纯自动布局方法代码清单

  -(void) viewDidLoad { 
UIScrollView * scrollView;
UIImageView * imageView;
NSDictionary * viewsDictionary;
//创建滚动视图和图像视图。
scrollView = [[UIScrollView alloc] init];
imageView = [[UIImageView alloc] init];
//将图像添加到图像视图。
[imageView setImage:[UIImage imageNamed:“ MyReallyBigImage”]]];
//将滚动视图添加到我们的视图中。
[self.view addSubview:scrollView];
//将图像视图添加到滚动视图。
[scrollView addSubview:imageView];
//将translatesAutoresizingMaskIntoConstraints设置为NO,以便视图自动调整大小蒙版不会转换为自动布局约束。
  scrollView.translatesAutoresizingMaskIntoConstraints = NO; 
imageView.translatesAutoresizingMaskIntoConstraints = NO;
  //设置滚动视图和图像视图的约束。 
viewsDictionary = NSDictionaryOfVariableBindings(scrollView,imageView);
[self.view addConstraints:[NSLayoutConstraintconstraintsWithVisualFormat:@“ H:| [scrollView] |” options:0指标:0 views:viewsDictionary]];
[self.view addConstraints:[NSLayoutConstraintconstraintsWithVisualFormat:@“ V:| [scrollView] |” options:0指标:0 views:viewsDictionary]];
[scrollView addConstraints:[NSLayoutConstraintconstraintsWithVisualFormat:@“ H:| [imageView] |” options:0指标:0 views:viewsDictionary]];
  [scrollView addConstraints:[NSLayoutConstraintconstraintsWithVisualFormat:@“ V:| [imageView] |”  options:0指标:0 views:viewsDictionary]]; 
/ *其余代码在这里... * /
}

这将为您提供一个滚动视图,该滚动视图的大小将随着视图控制器视图的大小而改变(例如在设备旋转时),而图像视图将成为滚动子视图。 您不必设置滚动视图的内容大小。

希望本文对希望以编程方式应用自动布局的人有用,本文内容引自https://developer.apple.com/library/content/technotes/tn2154/_index.html,请❤️将其推荐给其他人😊 。 让我知道您的反馈。 🙂