iOS 更新 TableViewCell 约束
Posted
技术标签:
【中文标题】iOS 更新 TableViewCell 约束【英文标题】:iOS Update TableViewCell Constraint 【发布时间】:2015-08-13 03:47:48 【问题描述】:我在处理TableViewCell 中的约束时遇到问题。我在 cell 中有一个 imageview,我想更新图像的约束。例如,宽度约束的默认值为120。如果imageUrl不为空,则宽度应为120,否则为0宽度。
我使用下面的代码将其更改为 0,它运行良好。在我滚动 TableView 后,由于约束将其锁定在 0 宽度,我的大部分图像都丢失了。我想将它更新回 120 宽度,但它似乎不起作用。任何帮助表示赞赏。
CGFloat cellImageWidth = 120.0;
NSDictionary *mainDictionary = @@"cellImage":cellImage;
NSArray *zeroWidth = [NSLayoutConstraint constraintsWithVisualFormat:[NSString stringWithFormat:@"H:[cellImage(%f)]", 0.0]
options:0
metrics:nil
views:mainDictionary];
NSArray *normalWidth = [NSLayoutConstraint constraintsWithVisualFormat:[NSString stringWithFormat:@"H:[cellImage(%f)]", cellImageWidth]
options:0
metrics:nil
views:mainDictionary];
if(![[imgArr objectAtIndex:indexPath.row] isEqualToString:@""])
[cellImage sd_setImageWithURL:[NSURL URLWithString:[NSString stringWithFormat:@"%@%@", imageInbox, [imgArr objectAtIndex:indexPath.row]]] placeholderImage:[UIImage imageNamed:@"placeholder.png"]];
cellImage.hidden = NO;
[cellImage removeConstraints:zeroWidth];
[cellImage addConstraints:normalWidth];
[cellImage updateConstraints];
else
cellImage.hidden = YES;
[cellImage removeConstraints:normalWidth];
[cellImage addConstraints:zeroWidth];
[cellImage updateConstraints];
【问题讨论】:
【参考方案1】:想一想:
-
为什么不更新使用的约束?设置约束一次,如果要更新更改
constant
属性。
您真的需要将约束更改为零吗?其他约束取决于它?
覆盖prepareForReuse
。当准备重用 UITableViewCell 以显示 UITableView 中另一个对象的信息时调用此方法,这在发生滚动时偶然发生。解决方案很简单,只需将以下代码插入我的 UITableViewCell 子类:-(void) prepareForReuse [self setNeedsUpdateConstraints];
【讨论】:
1.我尝试使用常量属性。但是在 tableviewcell 中它不允许这种方法。这将导致编译期间出错。 2. 是的,其他约束取决于它。 3.这是否意味着我应该使用prepareForReuse方法创建一个自定义的tableviewcell? 3.prepareForReuse
是 UITableViewCell 生命周期的一部分:developer.apple.com/library/ios/documentation/UIKit/Reference/…
2.如果你得到一个约束的错误变化常数,你做错了。你有这个 UITableViewCell 的 XIB 或 Storboard 单元吗?如果是,请将您在 xib/storyboard 中设置的约束连接到代码中的插座,并修改其常量值。如果没有,你在哪里创建这个约束(方法)?【参考方案2】:
尝试使用它。
NSLayoutConstraint *myConstraint =[NSLayoutConstraint
constraintWithItem:Your_Image
attribute:NSLayoutAttributeWidth
relatedBy:NSLayoutRelationGreaterThanOrEqual
toItem:nil
attribute:NSLayoutAttributeWidth
multiplier:1
constant:120];//120 is the width you want
【讨论】:
我试过这个方法。遗憾的是结果是一样的。它没有更新回 120 你可以尝试创建宽度约束的出口,然后将其常量设置为 120。 看来xcode不允许将IBOutlet与tableviewCell的内容进行匹配。我不确定是否有解决方法。有什么想法吗? 您必须从情节提要中添加约束。然后转到图像的宽度约束,然后拖放到您的 .h 文件中,它将创建宽度约束的出口。 & 然后将代码编写为 YOUR_OUTLET_NAME.constant=120 是的。我做了和你说的一样的方法。在编译期间,该约束会发生错误。它不允许编译以上是关于iOS 更新 TableViewCell 约束的主要内容,如果未能解决你的问题,请参考以下文章
swift:TableViewCell 在滚动之前不会更新约束
自定义 tableviewcell 动态高度未根据约束更新(以编程方式自动布局)
iOS:如何在其附件视图更改时触发 tableViewCell 的约束/自动布局刷新?
当 UICollectionView 位于 iOS 中的自定义 TableViewCell 中时,如何为 UICollectionView 实现委托和数据源方法,目标 C