我们有一个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:
,然后我们的代码跟随,这将正确设置新帧。除了这些之外没有其他电话,但标签仍保留在屏幕上的原始位置。
怎么了?为什么新框架设置不正确?还有其他的东西过分吗?我是否必须以某种方式重新布局或刷新它?
答案 0 :(得分:3)
从xib取消选中Autolayout。它可能有助于改变框架。
答案 1 :(得分:2)
请尝试以下步骤。这对你有用 -
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:
的来电。
您可以使用标签的约束在单元格中添加一些出口,并更改这些出口以更改框架。