UIView-Encapsulated-Layout-Height约束冲突及手势识别器警告求助
解决iOS布局约束冲突与手势识别器警告问题
一、布局约束冲突解决
错误日志里的两个冲突约束:一个是你手动添加的UIView.height == 250,另一个是系统自动生成的UIView-Encapsulated-Layout-Height(值926)。后者是系统根据当前视图容器(比如键盘控制器的View)自动设置的高度约束,优先级为最高级1000,和你手动添加的约束形成冲突。
可行解决方案:
- 推荐方案(针对键盘控制器):如果你是自定义键盘,无需手动添加高度约束,直接设置控制器的
preferredContentSize即可指定键盘高度:
override func viewDidLoad() { super.viewDidLoad() self.preferredContentSize = CGSize(width: UIScreen.main.bounds.width, height: 250) }
- 通用视图方案:如果是普通视图,可降低手动约束的优先级,让系统约束在冲突时优先生效(或根据需求调整):
let constraint = NSLayoutConstraint(item: self.view as Any, attribute: .height, relatedBy: .equal, toItem: nil, attribute: .notAnAttribute, multiplier: 0.0, constant: 250) constraint.priority = UILayoutPriority(999) // 低于系统默认的1000优先级 self.view.addConstraint(constraint)
二、长按手势识别器警告解决
警告提示同一个长按手势识别器被绑定到了多个视图上,原因是你在Storyboard/XIB中把同一个手势对象拖到了多个UIButton上——一个手势识别器只能属于单个视图。
可行解决方案:
- Storyboard/XIB修复:打开对应界面文件,删除重复绑定的手势识别器,给每个需要长按的按钮分别添加独立的长按手势,各自绑定对应的IBAction(比如一个按钮绑定
LongPressDelete,另一个绑定LongPressDelete2)。 - 代码创建手势(更灵活):通过代码为每个按钮创建独立的手势实例:
override func viewDidLoad() { super.viewDidLoad() // 给第一个删除按钮添加手势 let longPress1 = UILongPressGestureRecognizer(target: self, action: #selector(LongPressDelete(_:))) deleteButton1.addGestureRecognizer(longPress1) // 给第二个删除按钮添加手势 let longPress2 = UILongPressGestureRecognizer(target: self, action: #selector(LongPressDelete2(_:))) deleteButton2.addGestureRecognizer(longPress2) }
另外,你的手势代码存在小问题:AudioServicesPlaySystemSound(0x450)写在if语句外,会导致手势状态为began/ended/cancelled时都播放声音。如果只想在长按开始时播放,将该代码移至if sender.state == .began分支内即可。
内容的提问来源于stack exchange,提问作者dennis li
相关产品推荐
相关产品推荐

