带水平滚动的UIScrollView,自动布局分页

时间:2015-08-05 04:31:35

标签: ios uiscrollview autolayout

在我的应用程序中,我想要一个带有不同地址卡的水平滚动视图,如下图所示。

Address Cards

我通过storyboard向其viewcontroller添加了一个scrollview及其内容视图。以下是限制因素。

Autolayout Tree

我还为地址卡创建了一个.xib文件。每当我需要地址卡时,我都会通过loadNibNamed api加载这个.xib,因为我不知道我需要多少个地址卡。它是动态的。以下是我添加的代码。

self.scrollView.translatesAutoresizingMaskIntoConstraints = NO;
self.contentView.translatesAutoresizingMaskIntoConstraints = NO;

RVXVoterView *voterView = [[NSBundle mainBundle] loadNibNamed:@"RVXVoterView" owner:nil options:nil][0];
[self.contentView addSubview:voterView];

voterView.translatesAutoresizingMaskIntoConstraints = NO;

NSDictionary *views = NSDictionaryOfVariableBindings(self.scrollView, self.contentView, voterView);
[self.contentView addConstraints:[NSLayoutConstraint constraintsWithVisualFormat:@"H:|-30-[voterView]-30-|" options:0 metrics:nil views:views]];
[self.contentView addConstraints:[NSLayoutConstraint constraintsWithVisualFormat:@"V:|-15-[voterView]-15-|" options:0 metrics:nil views:views]];

RVXVoterView *voterView1 = [[NSBundle mainBundle] loadNibNamed:@"RVXVoterView" owner:nil options:nil][0];
[self.contentView addSubview:voterView1];

voterView1.translatesAutoresizingMaskIntoConstraints = NO;
views = NSDictionaryOfVariableBindings(self.scrollView, self.contentView, voterView, voterView1);
[self.contentView addConstraints:[NSLayoutConstraint constraintsWithVisualFormat:@"V:|-15-[voterView1]-15-|" options:0 metrics:nil views:views]];

[self.contentView addConstraint:[NSLayoutConstraint constraintWithItem:voterView1
                                                             attribute:NSLayoutAttributeWidth
                                                             relatedBy:NSLayoutRelationEqual
                                                                toItem:voterView
                                                             attribute:NSLayoutAttributeWidth
                                                            multiplier:1
                                                              constant:0]];
[self.contentView addConstraints:[NSLayoutConstraint constraintsWithVisualFormat:@"H:[voterView]-15-[voterView1]" options:0 metrics:nil views:views]];
[self.contentView layoutIfNeeded];
self.scrollView.contentSize = self.contentView.frame.size;
RVXLOG(@"content size is : %@",NSStringFromCGRect(self.contentView.frame));
[self.scrollView layoutIfNeeded];

在上面的代码中,我只添加了2张卡作为初始设置。 下面是我得到的最终画面。但我的问题是,为什么它不可滚动。我检查了阻止滚动的所有主要内容。我错过了什么。请帮我。 Final result

更新:我发现,即使我添加了新卡,contentView的宽度也没有增加。最初,contentView的宽度等于屏幕宽度。当我添加新卡时,它应该增加新的卡宽度。但这不会发生。它始终显示相同的宽度(iPhone6为375)。

1 个答案:

答案 0 :(得分:1)

要使UIScrollView使用AutoLayout进行滚动,您必须确保所有子视图都与滚动视图的所有四个边相关联。从你的代码我可以看到你把第一个视图(voterView)绑定到contentView的所有四个边缘,并试图将第二个视图(voterView1)绑定到第一个视图的右边,我不认为那样因为第一个视图的权利已经绑定到其父级(contentView)。

首先为您所演示的代码中的子视图添加widthheight约束,然后尝试以下VFL:

NSDictionary *views = NSDictionaryOfVariableBindings(voterView);
[self.contentView addConstraints:[NSLayoutConstraint constraintsWithVisualFormat:@"V:|-15-[voterView]-15-|" options:0 metrics:nil views:views]];
[self.contentView addConstraints:[NSLayoutConstraint constraintsWithVisualFormat:@"H:|-15-[voterView]" options:0 metrics:nil views:views]];

views = NSDictionaryOfVariableBindings(voterView, voterView1);
[self.contentView addConstraints:[NSLayoutConstraint constraintsWithVisualFormat:@"V:|-15-[voterView]-15-|" options:0 metrics:nil views:views]];
[self.contentView addConstraints:[NSLayoutConstraint constraintsWithVisualFormat:@"H:[voterView]-15-[voterView1]-15-|" options:0 metrics:nil views:views]];