如何动态设置 UIView 约束?

Posted

技术标签:

【中文标题】如何动态设置 UIView 约束?【英文标题】:How can I dynamically set UIView constraints? 【发布时间】:2015-04-01 12:03:55 【问题描述】:

我有一个自定义 UITableViewCell。它包含从上到下的标签和 UIImageViews。我为标签和 UIImageViews 添加了约束。所以我可以使用 systemLayoutSizeFittingSize: UILayoutFittingCompressedSize 来计算适合内容的单元格高度。但是 UIImageView 中的图像是使用 SDWebImage 从在线加载的。起初我可以为 UIImageView 设置一些约束。加载图像时,我应该更改 UIImageView 的约束以满足其大小。但有时会出现错误。有时还可以:

* -[NSLayoutConstraint _setSymbolicConstant:constant:] 中的断言失败,/SourceCache/Foundation_Sim/Foundation-1142.14/Layout.subproj/NSLayoutConstraint.m:585 2015-04-01 19:57:44.537 HiPDA[3760:63583] * 由于未捕获的异常“NSInternalInconsistencyException”而终止应用程序,原因:“常量不是有限的!那是违法的。常数:南' *** 首先抛出调用堆栈: ( 0 CoreFoundation 0x00000001113cfa75 __exceptionPreprocess + 165 1 libobjc.A.dylib 0x0000000111068bb7 objc_exception_throw + 45 2 CoreFoundation 0x00000001113cf8da +[NSException raise:format:arguments:] + 106 3 基础 0x000000010ef0cb6f -[NSAssertionHandler handleFailureInMethod:object:file:lineNumber:description:] + 195 4 基础 0x000000010ee87c7d -[NSLayoutConstraint _setSymbolicConstant:constant:] + 149

代码是:

__weak typeof(self) weakSelf = self;
__weak typeof(UIImageView *) weakImgView=imgView;
[imgView sd_setImageWithURL:[NSURL URLWithString:[dic objectForKey:THREADLISTDETAILIMAGE]] completed:^(UIImage *image, NSError *error, SDImageCacheType cacheType, NSURL *imageURL) 

    CGFloat width=image.size.width>maxWidth?maxWidth:image.size.width;
    NSLayoutConstraint *imgW1=[NSLayoutConstraint constraintWithItem:weakImgView attribute:NSLayoutAttributeWidth relatedBy:NSLayoutRelationEqual toItem:nil attribute:NSLayoutAttributeWidth multiplier:0.0 constant:width];
    [weakSelf.contentView addConstraint:imgW1];
    NSLayoutConstraint *imgH1=[NSLayoutConstraint constraintWithItem:weakImgView attribute:NSLayoutAttributeHeight relatedBy:NSLayoutRelationEqual toItem:nil attribute:NSLayoutAttributeHeight multiplier:0.0 constant:width*image.size.height/image.size.width];
    [weakSelf.contentView addConstraint:imgH1];

    [weakSelf needsUpdateConstraints];
    [weakSelf layoutIfNeeded];
    [weakSelf layoutSubviews];
];

如果图像完全下载,tableview 不会刷新。我可以看到图像来自单元格大小。我该如何解决?

【问题讨论】:

【参考方案1】:

您必须为 imageView 使用 Outlet NSLayoutConstraint 并以编程方式更改值

self.imgViewHeightConstraint.constant = 300(某个值)

【讨论】:

以及图片加载后如何调用tableview进行刷新。第一张图片显示加载图像时:imgsrc.baidu.com/forum/w%3D580/… 第二次手动刷新:imgsrc.baidu.com/forum/w%3D580/… 要刷新整个表格视图,您可以调用 [tableview reloadData] 或要重新加载单个单元格,如果您知道要刷新哪个 indexPath,则可以调用 reloadRowsAtIndexPaths:withRowAnimation: 方法。

以上是关于如何动态设置 UIView 约束?的主要内容,如果未能解决你的问题,请参考以下文章

如何使用自动布局在 Swift 中为可重用的 UIView 设置约束?

如何自动设置约束以使 UIView 之间的距离一致?

UIScrollView ContentView动态高度约束

使用函数调用将宽度约束设置为 UIView 不再起作用。 iOS ( Xcode 12.0.1 )

如何在不制作 IBOutlet 的情况下以编程方式在 Swift 中为 UIView 高度约束设置动画?

如何对 UIView 上的自动布局约束引起的大小变化做出反应?