ios - UIScrollView 以编程方式使 contectview 的 subview 的动态高度和宽度

标签 ios objective-c uiscrollview autolayout

我正在制作 ScrollView 的分页 View 。当我给出 subview 的固定宽度和高度时,效果很好。

让我给你看代码。

制作scrollview和contenview

 [self.view addSubview:self.scrollView];
[self.scrollView addSubview:self.contectView];

为 scrollview 和 contenview 添加约束

 NSDictionary *views = @{@"scrollView" : self.scrollView , @"contectView" : self.contectView };

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

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

在contectview中添加 subview

for (int i=0; i<10; i++) {

    UIView *productView =[self creatProductView];
    [self.contectView addSubview:productView];

 NSDictionary *views = @{@"productView" : productView , @"contectView" : self.contectView };
    if (i==0) {
        [self.contectView addConstraints:[NSLayoutConstraint constraintsWithVisualFormat:@"H:|[productView(==375)]" options:0 metrics:0 views:views]];
    }
    else{
        views = @{@"productView" : productView , @"contectView" : self.contectView , @"lastView" : lastView , @"view" : self.view};
        [self.contectView addConstraints:[NSLayoutConstraint constraintsWithVisualFormat:@"H:[lastView][productView(==375)]" options:0 metrics:0 views:views]];

    }
    [self.contectView addConstraints:[NSLayoutConstraint constraintsWithVisualFormat:@"V:|[productView(==667)]" options:0 metrics:0 views:views]];
    lastView = productView;
}

约束我需要改变:

    H:|[productView(==375)]
H:[lastView][productView(==375)]
V:|[productView(==667)]

如上所述,我已经给出了固定约束。我不能给 contectView 相对,因为它没有宽度和高度限制

最佳答案

我想这就是你想要的。

self.scrollView  = [UIScrollView new];
self.contectView = [UIView new];
self.scrollView.translatesAutoresizingMaskIntoConstraints  = NO;
self.contectView.translatesAutoresizingMaskIntoConstraints = NO;

[self.view addSubview:self.scrollView];
[self.scrollView addSubview:self.contectView];

NSDictionary *views = @{@"scrollView" : self.scrollView , @"contectView" : self.contectView };

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

//Adding equal width and height constraint with LOW priority
[self.scrollView addConstraints:[NSLayoutConstraint constraintsWithVisualFormat:@"V:|[contectView(==scrollView@250)]|" options:0 metrics:0 views:views]];
[self.scrollView addConstraints:[NSLayoutConstraint constraintsWithVisualFormat:@"H:|[contectView(==scrollView@250)]|" options:0 metrics:0 views:views]];

NSString *horizontalConstraintsFormat = @"";
NSMutableDictionary *subViews = [NSMutableDictionary new];
subViews[@"scrollView"] = self.scrollView;
int count = 10;
for (int i = 0; i < count; i++) {
    //Create your content view, e.g.
    UIView *productView = [UIView new];
    productView.backgroundColor = [UIColor colorWithWhite:arc4random()%100 / 100.0f alpha:1];

    //Important line! Disable translation of autoresizing mask into constraints
    productView.translatesAutoresizingMaskIntoConstraints = NO;
    [self.contectView addSubview:productView];

    NSString *key = [NSString stringWithFormat:@"productView%d", i];
    subViews[key] = productView;
    if (i == 0) {
        //pin to the left side and set equal width to scrollview
        horizontalConstraintsFormat = [horizontalConstraintsFormat stringByAppendingFormat:@"|-0-[%@(==scrollView)]", key];
    } else if (i == count - 1) { //is the last one
        //pin to the prev item and right side and set equal width to scrollview
        horizontalConstraintsFormat = [horizontalConstraintsFormat stringByAppendingFormat:@"-0-[%@(==scrollView)]-0-|", key];
    } else {
        //pin to the prev item and set equal width to scrollview
        horizontalConstraintsFormat = [horizontalConstraintsFormat stringByAppendingFormat:@"-0-[%@(==scrollView)]", key];
    }

    //Set equal height to scrollview
    NSString *verticalConstraintsFormat = [NSString stringWithFormat:@"V:|[%@(==scrollView)]", key];
    [self.scrollView addConstraints:[NSLayoutConstraint constraintsWithVisualFormat:verticalConstraintsFormat options:0 metrics:nil views:subViews]];
}

//applying generated format
[self.scrollView addConstraints:[NSLayoutConstraint constraintsWithVisualFormat:horizontalConstraintsFormat options:0 metrics:nil views:subViews]];

结果 =>>
enter image description here

关于ios - UIScrollView 以编程方式使 contectview 的 subview 的动态高度和宽度,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/37043150/

相关文章:

ios - 如何在 Objective C 中自动滚动自定义表格 View 单元格

ios - 不同版本的 UIScrollView - iOS

iphone - UIScrollView按预期工作,但scrollRectToVisible : does nothing

iphone - CoreLocation 和 Adhoc 分发的问题

ios - 在 Xcode 5.0 中运行单元测试时出错

objective-c - 如何强制 NSSplitView 的所有 subview 在启动时可见?

ios - 以编程方式使用 Autolayout 布局自定义 UITableViewCell

ios - iPhone 的 "Springboard" View 到底是什么?

ios - 如何过滤 UITableView 中的所有部分以获取想要的项目

ios - 无法授予对证书、标识符和配置文件的访问权限