在集合视图的 cellForItemAtIndexPath 方法中更改框架

Posted

技术标签:

【中文标题】在集合视图的 cellForItemAtIndexPath 方法中更改框架【英文标题】:Changing Frame in Collection View's cellForItemAtIndexPath Method 【发布时间】:2014-11-08 15:14:25 【问题描述】:

我是ios新手。

我使用了集合视图。我在其中使用原型单元格。我没有在我的应用中使用自动布局。

我需要更改按钮的框架并在cellForItemAtIndexPath 中查看。但是当我第一次滚动移动到下一个单元格时,它并没有第一次反映。我只能看到没有任何按钮或视图的空白。我检查了所有帧都正确更新。还是什么都看不到。

虽然如果我再次去上一个电话并回来它会正常看到。

请在下面找到cellForItemAtIndexPath的代码

- (UICollectionViewCell *)collectionView:(UICollectionView *)collectionView cellForItemAtIndexPath:(NSIndexPath *)indexPath
    
     Feed *feed;
    NSMutableAttributedString * string;

    feed = [arrTop objectAtIndex:indexPath.row];

    ShuffleCell *myCell = [collectionView
                         dequeueReusableCellWithReuseIdentifier:@"ShuffleCell"
                         forIndexPath:indexPath];

    myCell.index = indexPath;


    myCell.delegate = self;


   // Below frame changes are not working


        myCell.vwBack.frame = collect.frame;
        myCell.imgShare.frame = CGRectMake(myCell.imgShare.frame.origin.x, myCell.imgShare.frame.origin.y, self.view.frame.size.width,self.view.frame.size.width );
        myCell.lblText.center = CGPointMake(myCell.imgShare.frame.size.width / 2, myCell.imgShare.frame.size.height / 2);
        myCell.lblText.frame = CGRectMake(20
                                          , myCell.imgShare.frame.origin.y + 20, self.view.frame.size.width - 20,self.view.frame.size.width -20);

        int totHeight = (collect.frame.size.height - self.view.frame.size.width);
        myCell.vwBtn.frame = CGRectMake(myCell.vwBtn.frame.origin.x, collect.frame.size.height -totHeight, myCell.vwBtn.frame.size.width, totHeight);
        [myCell.vwBtn setFrame:CGRectMake(myCell.vwBtn.frame.origin.x, collect.frame.size.height -totHeight, myCell.vwBtn.frame.size.width, totHeight)];
        myCell.btnFavoriteBack.frame = CGRectMake(myCell.btnFavoriteBack.frame.origin.x, 0, myCell.btnFavoriteBack.frame.size.width, totHeight/3);
        [myCell.btnFavoriteBack setFrame:CGRectMake(myCell.btnFavoriteBack.frame.origin.x, 0, myCell.btnFavoriteBack.frame.size.width, totHeight/3)];
        myCell.btnShare.frame = CGRectMake(myCell.btnShare.frame.origin.x, (totHeight/3), myCell.btnShare.frame.size.width, totHeight/3);
        myCell.btnReport.frame = CGRectMake(myCell.btnReport.frame.origin.x, (totHeight/3)*2, myCell.btnReport.frame.size.width, totHeight/3);
        myCell.vwLikeBtn.frame = CGRectMake(self.view.frame.size.width - 82, (totHeight/3 - 32)/2, 82,32);

        NSLog(@"Y :- %f",myCell.vwBtn.frame.size.height);





    return myCell;

我还附上了相同的屏幕截图。

感谢您的帮助。

【问题讨论】:

在返回单元格之前添加一行 [cell setNeedsLayout] 看看会发生什么。 @gabbler 感谢您的帮助。但还是同样的问题。 【参考方案1】:

添加此行应该可以解决问题。让单元格的子视图将它们的框架转换为约束。

cell.label.translatesAutoresizingMaskIntoConstraints = YES;

【讨论】:

是否需要为所有要更改其框架的子视图编写此行? 是的,可能你必须这样做。 它不工作。奇怪的是,如果转到上一个单元格并再次返回,它会完美运行。 情节提要中是否开启了自动布局? 否,自动布局未开启。

以上是关于在集合视图的 cellForItemAtIndexPath 方法中更改框架的主要内容,如果未能解决你的问题,请参考以下文章

集合视图单元格没有出现在集合视图中?

是否可以将集合视图保留在另一个集合视图中?

我可以将集合视图添加到集合视图部分标题吗?

如何在表格视图单元格内创建集合视图

如果集合视图嵌入到 ios 的表视图中,如何始终显示集合视图的第一项

视图控制器中的集合视图,单元格触摸集合视图本身的顶部边框(嵌入在导航控制器中)