在UICollectionViewCell中更改标签位置

时间:2013-12-19 16:27:23

标签: ios objective-c uicollectionview frame

我们有一个UICollectionView,它在Storyboard上有一个原型单元格。单元格中包含UILabel(“label”),其位置没有自动布局。

我们使用setFrame在-collectionView:cellForItemAtIndexPath:中有条件地设置标签的框架,如下所示:

- (UICollectionViewCell *)collectionView:(UICollectionView *)collectionView
                  cellForItemAtIndexPath:(NSIndexPath *)indexPath
{
    CategoryCell *cell;
    cell = [collectionView dequeueReusableCellWithReuseIdentifier:@"Category" forIndexPath:indexPath];

    ...

    if (self.isViewTypeList) {            
        [((CategoryCell *)cell).label setFrame:FRAME_RECT];
    }

    ...

    return cell;
}

我们已经检查了它,似乎首先它在到达dequeing时使用Storyboard值调用标签-setFrame:,然后我们的代码跟随,这将正确设置新帧。除了这些之外没有其他电话,但标签仍保留在屏幕上的原始位置。

怎么了?为什么新框架设置不正确?还有其他的东西过分吗?我是否必须以某种方式重新布局或刷新它?

4 个答案:

答案 0 :(得分:3)

从xib取消选中Autolayout。它可能有助于改变框架。

答案 1 :(得分:2)

请尝试以下步骤。这对你有用 -

  • 在故事板或XIB文件中选择原型单元格
  • 选择要更改框架的标签
  • tag中设置Attributes Inspector (View Section)属性,例如设置tag = 101

在您的代码部分之后执行此操作 -

- (UICollectionViewCell *)collectionView:(UICollectionView *)collectionView
                  cellForItemAtIndexPath:(NSIndexPath *)indexPath
{
//...
    CategoryCell *cell;
    cell = [collectionView dequeueReusableCellWithReuseIdentifier:@"Category" 
                                                     forIndexPath:indexPath];
    //...
    if (self.isViewTypeList) {
        UILabel *lbl = (UILabel *)[cell viewWithTag:101];
        [lbl setFrame:FRAME_RECT];
    }
    //...
}

祝你好运!

答案 2 :(得分:0)

尝试:

- (UICollectionViewCell *)collectionView:(UICollectionView *)collectionView
                  cellForItemAtIndexPath:(NSIndexPath *)indexPath
{
    //...
    //instead of
    //CategoryCell *cell;
    //cell = [collectionView dequeueReusableCellWithReuseIdentifier:@"Category" 
    //                                                 forIndexPath:indexPath];
    CategoryCell *cell = (CategoryCell *)[collectionView dequeueReusableCellWithReuseIdentifier:@"Category"
                                                                                   forIndexPath:indexPath];
    //sure reuse-identifier is "Category"?

    //...
    if (self.isViewTypeList) {
        //instead of
        //[((CategoryCell *)cell).label setFrame:FRAME_RECT];
        [cell.label setFrame:FRAME_RECT];
    }
    //...
    return cell;
}

也会通过此链接查看您是否遗漏了一些关键步骤:
http://ashfurrow.com/blog/uicollectionview-example

答案 3 :(得分:-1)

Autolayout会覆盖您对setFrame:的来电。 您可以使用标签的约束在单元格中添加一些出口,并更改这些出口以更改框架。