如何将Storyboard中某元素的所有约束复制到另一个元素上?
结论
该操作完全可以实现,手动对照重建约束非常容易遗漏约束关联项、参数配置,出现布局错乱是很常见的情况。
零布局风险的实现方案
方案1:直接修改原有图片视图的类型(推荐,不会丢失任何约束)
这是最省事、100%不会打乱原有布局的方式:
- 选中Storyboard中当前的UIImageView,打开右侧身份检查器(Identity Inspector)
- 将Class字段的
UIImageView直接修改为UIView,回车确认
注意:修改类型后原UIImageView的图片配置属性会消失,你可以提前记录原有图片资源,后续在这个转成UIView的容器里,添加UIImageView子视图承载原有图片,或者添加其他任意自定义内容都可以。所有原本绑定在该元素上的约束、以及其他元素以它为参照的相对定位约束会全部保留,不会出现任何移位。
方案2:需要保留原有UIImageView时的约束迁移方法
如果你不想改动原有UIImageView,要把所有约束迁移到同级的新UIView上,不要手动逐个添加约束,用Xcode自带的约束重定向功能即可:
- 先拖拽一个新的UIView到画布上,暂时不要给它添加任何约束,随意放置即可
- 按住Command键同时选中原有UIImageView和刚添加的新UIView
- 点击画布右下角Auto Layout工具栏的Resolve Auto Layout Issues按钮(带三角形的图标),选择「Repoint Constraints」,在弹出的选择框中,将所有指向原UIImageView的约束目标修改为新添加的UIView
- 迁移完成后,你可以将原UIImageView作为子视图放到新UIView中,调整对应位置即可,所有关联的相对定位约束不会断裂。
手动配置约束时布局错乱的常见原因
你之前手动配置后布局异常,基本都是遗漏了以下细节导致的:
- 遗漏了反向关联的约束:你只给新View添加了自身相对父视图/其他元素的定位约束,但是忘了其他元素是以原图片为参照对象的——比如某按钮的约束是「在原图片右侧8pt」,这部分约束的关联对象没有从原图片改到新View上,就会出现约束冲突或者缺失
- 约束参数配置错误:手动复刻时容易写错
constant的正负方向、multiplier的比例值、约束优先级(priority),哪怕差一个数值都会导致布局计算结果和原来不一致 - 遗漏了固有尺寸相关约束:UIImageView有基于图片资源的固有内容尺寸(intrinsic content size),普通UIView没有这个特性,如果你没有给新View补全宽高、或者对应边的支撑约束,布局系统会因为缺少约束出现位置漂移。
内容的提问来源于stack exchange,提问作者CichlidGold
相关产品推荐
相关产品推荐

