0

我在不同的视图中制作了几个 UIScrollView,它们都可以在没有 Autolayout 的情况下工作。我打开了自动布局,因为它对我的应用程序更好。但从那以后,我的 UIScrollView 出现了一个大问题:没有人在滚动,它们不起作用。

这是我的 UIScrollView 代码:

米:

  -(viewDidLoad) {
        scrollerHome.contentSize = CGSizeMake(320, 1000);
        scrollerHome.scrollEnabled = YES;
        [self.view addSubview:scrollerHome];
        scrollerHome.showsHorizontalScrollIndicator = false;
        scrollerHome.showsVerticalScrollIndicator = false;

        [super viewDidLoad];

}

。H:

@interface ViewController : UIViewController{


    IBOutlet UIScrollView *scrollerHome;
}

我是否必须添加一些代码,因为我打开了自动布局?

4

3 回答 3

2

你应该在做任何事情之前调用 [super viewDidLoad] !

于 2013-08-07T15:14:27.380 回答
1

在自动布局中,您无需contentSize手动设置。自动布局与滚动视图的工作方式略有不同,contentSize滚动视图的 由滚动视图的子视图的约束决定。

如果您试图将其强制contentSize为较大的尺寸(例如,您正在实现一些无限滚动条),您可以添加适当大小的子视图,例如:

UIView *containerView = [[UIView alloc] init];
containerView.translatesAutoresizingMaskIntoConstraints = NO;
[self.scrollView addSubview:containerView];
NSDictionary *views = NSDictionaryOfVariableBindings(containerView);
[self.scrollView addConstraints:[NSLayoutConstraint constraintsWithVisualFormat:@"H:|[containerView]|"       options:0 metrics:nil views:views]];
[self.scrollView addConstraints:[NSLayoutConstraint constraintsWithVisualFormat:@"V:|[containerView(1000)]|" options:0 metrics:nil views:views]];

但是,如果您尝试设置contentSize预期添加子视图,您通常不需要做任何事情,例如上面的代码片段。只需添加您的子视图,提供它们的约束,自动布局将contentSize自动调整滚动视图。


如上所述,使用自动布局,您只需将子视图添加到滚动视图(及其约束),contentSize就会自动为您计算。

不过,这里有一个技巧。有时您想根据屏幕尺寸调整子视图的大小。但是使用这些符号的常用技术是|行不通的。例如,对于滚动视图imageview1内部,通常@"H:|[imageview1]|"不会将 设置imageview1为屏幕的宽度,而是将滚动视图定义contentSize为与 的宽度匹配imageview1,但它没有说明该图像视图的宽度是多少应该!

因此,捕获对滚动视图的superview. 这样,你可以使用类似的东西@"H:|[imageview1(==superview)]|",它不仅说“使滚动视图contentSize等于宽度imageview1”,而且“定义宽度imageview1等于滚动视图的宽度superview”。

因此,例如,要在分页滚动视图中添加三个图像,您可能会执行以下操作:

UIImageView *imageview1 = [[UIImageView alloc] initWithImage:[UIImage imageNamed:@"_DSC0004.jpg"]];
imageview1.contentMode = UIViewContentModeScaleAspectFit;
imageview1.translatesAutoresizingMaskIntoConstraints = NO;
[self.scrollView addSubview:imageview1];

UIImageView *imageview2 = ... // configured similar to imageview1

UIImageView *imageview3 = ... // configured similar to imageview1

UIView *superview = self.scrollView.superview;

NSDictionary *views = NSDictionaryOfVariableBindings(imageview1, imageview2, imageview3, superview);

// not only define the image view's relation with their immediate scroll view,
// but also explicitly set the size in relation to the superview, too!

[superview addConstraints:[NSLayoutConstraint constraintsWithVisualFormat:@"V:|[imageview1(==superview)][imageview2(==superview)][imageview3(==superview)]|" options:0 metrics:nil views:views]];
[superview addConstraints:[NSLayoutConstraint constraintsWithVisualFormat:@"H:|[imageview1(==superview)]|" options:0 metrics:nil views:views]];
[superview addConstraints:[NSLayoutConstraint constraintsWithVisualFormat:@"H:|[imageview2(==superview)]|" options:0 metrics:nil views:views]];
[superview addConstraints:[NSLayoutConstraint constraintsWithVisualFormat:@"H:|[imageview3(==superview)]|" options:0 metrics:nil views:views]];

self.scrollView.pagingEnabled = YES;
于 2013-08-07T15:29:04.557 回答
0

来自 Apple iOS 6.0 发行说明:

“一般来说,自动布局将视图的顶部、左侧、底部和右侧边缘视为可见边缘。也就是说,如果您将视图固定到其父视图的左边缘,那么您实际上是将其固定到超级视图边界的最小 x 值。更改超级视图的边界原点不会改变视图的位置。

UIScrollView 类通过更改其边界的原点来滚动其内容。为了使用自动布局,滚动视图中的顶部、左侧、底部和右侧边缘现在意味着其内容视图的边缘。”

您可以在此处找到完整的注释,并在我引用的部分中找到您问题的答案。他们提供了有关如何在混合自动布局环境中使用 UIScrollView 的代码示例。

于 2013-08-07T15:22:33.103 回答