UIScrollView的与iOS自动布局约束:为子视图大小错误(UIScrollView with

2019-09-02 06:43发布

我试图生成代码视图。 这是我的看法对象的层次结构

  • UIScrollView中
    • 的UIView
      • 的UIButton

滚动视图应该是大小的窗口相同。 该按钮应尽可能地大。 我使用的是iOS自动布局,所以我所有的对象的约束字符串这个样子

H:|[object]|
V:|[object]|

我还设置translatesAutoresizingMaskIntoConstraintsNO为每个对象。

问题是,该按钮只得到了默认的按钮大小。 其父视图对象(UIView的)只得到大小子视图需要。

红色:UIScrollView中/黄色:的UIView

我怎样才能迫使这些观点是一样大的滚动视图?

当我使用一个UIView,而不是日的UIScrollView的一切都很正常......

下面是一些代码:

    - (void) viewDidLoad {

        [super viewDidLoad];

        // SCROLL VIEW
        UIScrollView* scrollView = [UIScrollView new];
        scrollView.backgroundColor=[UIColor redColor];
        scrollView.translatesAutoresizingMaskIntoConstraints = NO;

        //CONTAINER VIEW
        UIView *containerView = [UIView new];
        containerView.translatesAutoresizingMaskIntoConstraints = NO;
        containerView.backgroundColor = [UIColor yellowColor];
        [scrollView addSubview:containerView];

        // CONSTRAINTS SCROLL VIEW - CONTAINER VIEW
        [scrollView addConstraints:
         [NSLayoutConstraint constraintsWithVisualFormat:@"H:|[containerView]|"
                                                 options:0 metrics:nil
                                                   views:@{@"containerView":containerView}]];
        [scrollView addConstraints:
         [NSLayoutConstraint constraintsWithVisualFormat:@"V:|[containerView]|"
                                                 options:0 metrics:nil
                                                   views:@{@"containerView":containerView}]];

        // BUTTON
        UIButton* button = [UIButton buttonWithType:UIButtonTypeRoundedRect];
        button.translatesAutoresizingMaskIntoConstraints = NO;
        [button setTitle:@"I'm way to small" forState:UIControlStateNormal];
        [containerView addSubview:button];

        // CONSTRAINTS CONTAINER VIEW - BUTTON
        [containerView addConstraints:
         [NSLayoutConstraint constraintsWithVisualFormat:@"H:|[button]|"
                                                 options:0 metrics:nil
                                                   views:@{@"button":button}]];
        [containerView addConstraints:
         [NSLayoutConstraint constraintsWithVisualFormat:@"V:|[button]|"
                                                 options:0 metrics:nil
                                                   views:@{@"button":button}]];
        self.view = scrollView;

    }

更新:我真的不知道,为什么发生这种情况。 如果您在IB建立视图,连接插座和实例化代码视图,滚动视图的行为像一个普通视图(垂直地反弹)。 它的contentSize计算不正确。 更多在这里 。 但如何正确地做到这一点?

Answer 1:

一对夫妇的意见:

  1. 在滚动视图的子视图约束不起作用像其他视图的约束。 他们用来设置contentSize滚动视图的。 (见TN2154 。)这样,你扔了一堆东西在滚动视图,设置里面的东西的约束,和contentSize是为您计算。 这是非常酷的功能,但它是对立的你想在这里做什么。

  2. 更糟的是,按键会,除非你自己一个按钮的宽度和高度设置明确的约束,将根据其内容调整大小。

这两种意见的净效应是,现有的限制说:“(一)设置我的容器是我的按钮的规模;(b)让我的按钮,动态调整自身到文本的大小;及(c)把我的滚动视图的contentSize根据我的容器(其为按钮的尺寸)的大小“。

我不清楚的业务问题是什么。 但这里有一些约束条件达到什么样的,我认为你的技术问题是:

- (void)viewDidLoad
{
    [super viewDidLoad];

    UIView *view = self.view;

    UIScrollView *scrollView = [[UIScrollView alloc] init];
    scrollView.backgroundColor = [UIColor redColor]; // just so I can see it
    scrollView.translatesAutoresizingMaskIntoConstraints = NO;
    [self.view addSubview:scrollView];

    UIView *containerView = [[UIView alloc] init];
    containerView.backgroundColor = [UIColor yellowColor]; // just so I can see it
    containerView.translatesAutoresizingMaskIntoConstraints = NO;
    [scrollView addSubview:containerView];

    UIButton *button = [UIButton buttonWithType:UIButtonTypeRoundedRect];
    button.translatesAutoresizingMaskIntoConstraints = NO;
    [button setTitle:@"I'm the right size" forState:UIControlStateNormal];
    [containerView addSubview:button];

    NSDictionary *views = NSDictionaryOfVariableBindings(scrollView, button, view, containerView);

    // set the scrollview to be the size of the root view

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

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

    // set the container to the size of the main view, and simultaneously
    // set the scrollview's contentSize to match the size of the container

    [view addConstraints:[NSLayoutConstraint constraintsWithVisualFormat:@"H:|[containerView(==view)]|"
                                                                       options:0
                                                                       metrics:nil
                                                                         views:views]];

    [view addConstraints:[NSLayoutConstraint constraintsWithVisualFormat:@"V:|[containerView(==view)]|"
                                                                       options:0
                                                                       metrics:nil
                                                                         views:views]];

    // set the button size to be the size of the container view

    [containerView addConstraints:[NSLayoutConstraint constraintsWithVisualFormat:@"H:|[button(==containerView)]"
                                                                          options:0
                                                                          metrics:nil
                                                                            views:views]];

    [containerView addConstraints:[NSLayoutConstraint constraintsWithVisualFormat:@"V:|[button(==containerView)]"
                                                                          options:0
                                                                          metrics:nil
                                                                            views:views]];

}

坦率地说,我不明白你的UI的商业意图,因为这感觉就像汽车布局的扭曲达到了非常简单的用户界面。 我不知道为什么你有一个滚动视图,如果你有它的“屏幕尺寸”的内容(除非你是通过按钮分页)。 我不知道为什么你必须在一个单一的项目内容视图。 我不明白为什么您使用的是全屏幕按钮(我只是把敲击手势根观点在这一点上和收工)。

我假设你拥有这一切很好的理由,但它可能是有意义的备份,请问你有什么期望的用户体验,然后接近新鲜的问题,看看是否有达到预期的效果更有效的方法。



文章来源: UIScrollView with iOS Auto Layout Constraints: Wrong size for subviews