UIScrollView 不使用 AutoLayout 滚动

Posted

技术标签:

【中文标题】UIScrollView 不使用 AutoLayout 滚动【英文标题】:UIScrollView does not scroll with AutoLayout 【发布时间】:2015-02-27 04:58:19 【问题描述】:

使用 Autolayout 时,我无法让 UIScrollView 垂直滚动,我尝试了很多建议。我已经阅读了 Apple 的 technical note,但即使这样似乎也不适用于我的纯自动布局方法。

这是我在容器视图中添加两个 UIView 块 1 和 2 的简单代码。正如许多在线参考所建议的那样,容器视图本身是 UIScrollView 的唯一子项。我将块 1 和块 2 的高度分别设置为 800 点,但滚动视图不会滚动。

    - (void)viewDidLoad 
        [super viewDidLoad];


        // Test UIScrollView with Autolayout, scrolling should word

        UIView *mainView = self.view;

        UIScrollView* scrollView = [UIScrollView new];
        scrollView.translatesAutoresizingMaskIntoConstraints = NO;
        scrollView.backgroundColor = [UIColor redColor];
        [self.view addSubview:scrollView];

        UIView* contentView = [UIView new];
        contentView.translatesAutoresizingMaskIntoConstraints = NO;
        contentView.backgroundColor = [UIColor greenColor];
        [scrollView addSubview:contentView];

        UIView* block1 = [[UIView alloc] init];
        block1.translatesAutoresizingMaskIntoConstraints = NO;
        [block1 setBackgroundColor:[UIColor blackColor]];
        [contentView addSubview:block1];

        UIView* block2 = [[UIView alloc] init];
        block2.translatesAutoresizingMaskIntoConstraints = NO;
        [block2 setBackgroundColor:[UIColor blackColor]];
        [contentView addSubview:block2];


        NSDictionary* viewDict = NSDictionaryOfVariableBindings(mainView,scrollView, contentView, block1, block2);

        [self.view addConstraints:[NSLayoutConstraint constraintsWithVisualFormat:@"H:|[scrollView]|" options:0 metrics:0 views:viewDict]];
        [self.view addConstraints:[NSLayoutConstraint constraintsWithVisualFormat:@"V:|[scrollView]|" options:0 metrics:0 views:viewDict]];


        [self.view addConstraints:[NSLayoutConstraint constraintsWithVisualFormat:@"H:|[contentView(==mainView)]|" options:0 metrics:0 views:viewDict]];
        [self.view addConstraints:[NSLayoutConstraint constraintsWithVisualFormat:@"V:|[contentView(==mainView)]|" options:0 metrics:0 views:viewDict]];


        [contentView addConstraints:[NSLayoutConstraint constraintsWithVisualFormat:@"H:|[block1(==300)]" options:0 metrics:0 views:viewDict]];
        [contentView addConstraints:[NSLayoutConstraint constraintsWithVisualFormat:@"V:|[block1(==800)]" options:0 metrics:0 views:viewDict]];

        [contentView addConstraints:[NSLayoutConstraint constraintsWithVisualFormat:@"H:|[block2(==300)]" options:0 metrics:0 views:viewDict]];
        [contentView addConstraints:[NSLayoutConstraint constraintsWithVisualFormat:@"V:|-810-[block2(==800)]" options:0 metrics:0 views:viewDict]];


【问题讨论】:

首先,我将块 y 轴上的约束定义为 V:|[block1(==800)]-10-[block2(==block1)]|。至于滚动,我相信您需要在某处定义某物的框架。滚动视图的框架/边界是 (0,0,0,0),即使您在滚动视图中添加内容视图和内容视图中的块,这些边界仍然可以是 (0,0, 0,0) 并且仍然满足您列出的约束...它只是将块添加到大小为 (0,0) 的 UIView 之上。我会 nslog 您的内容视图和滚动视图的边界以确认 我认为 UIScrollView 是使用自动布局的最差控件。正如技术说明中所解释的,关键的困难是要求滚动视图中包含的内容不依赖于滚动视图的大小。换句话说,它不像一个普通的容器视图,里面的东西可以随着它们的容器扩展或收缩(因此,设备大小)。他们给出的示例使用了具有固有大小的图像视图。我不认为这对现实生活中的应用很有帮助。 【参考方案1】:

查看您的代码,您的内容视图的大小似乎与 UIView 的大小相同。

例如:如果设备屏幕高度为 568,那么您的内容视图大小将为 568,并且您将 block2 设置为 y 位置 = 180。

您的代码:

    [self.view addConstraints:[NSLayoutConstraint constraintsWithVisualFormat:@"V:|[contentView(==mainView)]|" options:0 metrics:0 views:viewDict]];

更改:

    [self.view addConstraints:[NSLayoutConstraint constraintsWithVisualFormat:@"V:|[contentView(2000)]|” options:0 metrics:0 views:viewDict]];

希望它能解决您的问题,如果有任何进一步的问题请告诉我。

【讨论】:

【参考方案2】:

如果您只想让滚动视图与自动布局一起使用,您可以试试这个。 http://natashatherobot.com/ios-autolayout-scrollview/

【讨论】:

【参考方案3】:

在您的代码中进行以下更改

[self.view addConstraints:[NSLayoutConstraint constraintsWithVisualFormat:@"V:|[contentView]|" options:0 metrics:0 views:viewDict]];

[contentView addConstraints:[NSLayoutConstraint constraintsWithVisualFormat:@"V:|-810-[block2(==800)]|" options:0 metrics:0 views:viewDict]];

希望对你有帮助

【讨论】:

以上是关于UIScrollView 不使用 AutoLayout 滚动的主要内容,如果未能解决你的问题,请参考以下文章

UIScrollView 不使用 UICollectionView 滚动

UIScrollView 不滚动?

UIScrollView 不使用 RubyMotion 滚动

UIScrollView 不使用 AutoLayout 滚动

在不使用捏/UIScrollView 的情况下缩小照片

不使用 UIScrollView 滚动屏幕