Swift修改UIButton位置不生效 添加自定义SubCollectionView后失效
问题原因
- 最核心的原因是你的项目中
defaultAddButton使用了Auto Layout约束布局:手动修改frame/center的优先级低于Auto Layout约束,添加子视图addSubview操作会触发当前视图层级的布局刷新,会把你手动修改的center值重置为约束指定的位置。去掉addSubview时没有触发布局刷新,所以手动修改的位置暂时能生效,本质上这种修改方式本身就不符合Auto Layout的规范,后续只要触发布局刷新(比如屏幕旋转、其他视图更新)还是会被重置。 - 次要可能:你自定义的
SubCollectionView内部重写了layoutSubviews等布局相关方法,意外触发了父视图的全局布局刷新,或内部逻辑修改了父视图的布局参数。
解决方案
方案1:使用Auto Layout规范修改位置(推荐)
不要直接修改center属性,而是修改按钮对应约束的constant值:
- 给
defaultAddButton的垂直方向约束(比如top约束、centerY约束)绑定IBOutlet属性,示例:
@IBOutlet weak var buttonCenterYConstraint: NSLayoutConstraint!
- 点击事件中替换原修改
center的代码:
// 原代码 self.defaultAddButton.center.y += 200 替换为下面两行 buttonCenterYConstraint.constant += 200 self.view.layoutIfNeeded()
方案2:强制手动frame布局生效
如果你确定要继续用frame修改位置,不需要Auto Layout约束,可以用两种方式处理:
- 给按钮开启frame自动转约束,修改后强制布局:
self.defaultAddButton.translatesAutoresizingMaskIntoConstraints = true self.defaultAddButton.center.y += 200
- 把修改位置的逻辑放到子视图添加后的主队列异步执行,等布局刷新完成后再修改:
self.view.addSubview(uiView) DispatchQueue.main.async { self.defaultAddButton.center.y += 200 }
内容的提问来源于stack exchange,提问作者Jins_1312
相关产品推荐
相关产品推荐

