如何以编程方式在 UICollectionView 上添加自动布局?

Posted

技术标签:

【中文标题】如何以编程方式在 UICollectionView 上添加自动布局?【英文标题】:How to add auto layout on UICollectionView programmatically? 【发布时间】:2015-06-10 12:44:17 【问题描述】:

我以编程方式创建了一个uicollectionview,并且我想在集合视图上添加自动布局约束,以便以后可以更改框架。但是下面的代码是行不通的。

我正在尝试像这样初始化集合视图:

        self.rootCollectionView = [[UICollectionView alloc]initWithFrame:CGRectMake(0, 100, self.bounds.size.width, self.bounds.size.height - 100) collectionViewLayout:[[UICollectionViewFlowLayout alloc]init]];
        self.rootCollectionView.dataSource = self;
        self.rootCollectionView.delegate = self;
        self.rootCollectionView.backgroundColor = [UIColor clearColor];
        [self addSubview:self.rootCollectionView];
        [self.rootCollectionView registerClass:[CASlideSwitchViewCell class] forCellWithReuseIdentifier:@"CASlideSwitchViewCell"];
        self.topConstraint = 100;
        float topCon = self.topConstraint;//self.topConstraint is a CGFloat property,
        UICollectionView * cv = self.rootCollectionView;
        cv.translatesAutoresizingMaskIntoConstraints = NO;
        NSArray * constraintArray = [NSLayoutConstraint constraintsWithVisualFormat:@"H:|-0-[cv]-0-|" options:0 metrics:nil views:NSDictionaryOfVariableBindings(cv)];
        NSArray *constraintArray2 = [NSLayoutConstraint constraintsWithVisualFormat:@"V:|-topCon-[cv]-0-|" options:0 metrics:@@"topCon":@(topCon) views:NSDictionaryOfVariableBindings(cv)];
        [self addConstraints:constraintArray];
        [self addConstraints:constraintArray2];

然后在收到数据后,我尝试根据数据更改 topConstraint。像这样:

if (number <= 1) 
    self.topScrollView.hidden = YES;
    self.topConstraint = 0;
else
    self.topScrollView.hidden = NO;
    self.topConstraint = 100;

[self updateConstraints];
[self.rootCollectionView.collectionViewLayout invalidateLayout];
[self.rootCollectionView reloadData];

但是,UICollectionView 的上边距始终为 100。

我错过了什么吗?或者这样添加自动布局是不对的?

【问题讨论】:

尝试从笔尖添加自动布局,这样会很容易 @nischalhada 我知道 nib 很容易使用,但是在这个项目中,我不允许使用 nib。 【参考方案1】:

self.topConstraint 是浮点数而不是 NSLayoutConstraint,因此您无法更新约束。您可以代替使用

NSArray *constraintArray2 = [NSLayoutConstraint constraintsWithVisualFormat:@"V:|-topCon-[cv]-0-|" options:0 metrics:@@"topCon":@(topCon) views:NSDictionaryOfVariableBindings(cv)];

你应该使用

NSLayoutConstraint *topLayoutContraint = [NSLayoutConstraint constraintWithItem:cv
                             attribute:NSLayoutAttributeTop
                             relatedBy:NSLayoutRelationEqual
                                toItem:self
                             attribute:NSLayoutAttributeTop
                            multiplier:1.0
                              constant:100];

NSArray *constraintArray2 = @[
                              topLayoutContraint,
                              [NSLayoutConstraint constraintWithItem:cv
                                                           attribute:NSLayoutAttributeBottom
                                                           relatedBy:NSLayoutRelationEqual
                                                              toItem:self
                                                           attribute:NSLayoutAttributeBottom
                                                          multiplier:1.0
                                                            constant:0]
                              ];

那么你可以

if (number <= 1) 
    self.topScrollView.hidden = YES;
    topLayoutContraint.constant = 0;
 else 
    self.topScrollView.hidden = NO;
    topLayoutContraint.constant = 100;


[self setNeedsLayout];
[self.rootCollectionView reloadData];

【讨论】:

约束是正确的,但它似乎不适用于以编程方式创建的 UICollectionView。 self.rootCollectionView = [[UICollectionView alloc]initWithFrame:CGRectMake(0, 100, self.bounds.size.width, self.bounds.size.height-100) collectionViewLayout:[[UICollectionViewFlowLayout alloc]init]]; NSLayoutConstraint *topLayoutContraint = [NSLayoutConstraint constraintWithItem:cv attribute:NSLayoutAttributeTop relatedBy:NSLayoutRelationEqual toItem:self attribute:NSLayoutAttributeTop multiplier:1.0 constant:0]; 我已经尝试了上面的代码,它创建了 100 边距,并立即添加了 0 边距的约束,但它仍然不起作用。 我为我的小错误感到抱歉。你应该使用topLayoutContraint.constant = 0; 顺便说一下,cv.translatesAutoresizingMaskIntoConstraints = NO;不能被删除

以上是关于如何以编程方式在 UICollectionView 上添加自动布局?的主要内容,如果未能解决你的问题,请参考以下文章

如何以编程方式在 uicollectionview 中插入图像?

如何以编程方式快速创建 uicollectionview(没有情节提要)

如何根据 UICollectionView 的部分以编程方式更新标签

以编程方式创建 UICollectionView

如何以编程方式推送 UICollectionView? [复制]

我如何以编程方式将 uicollectionview 放在扩展的 uitableviewcell 中