在使用UIAlertController的preferredStyle = actionSheet过程中出现NSLayoutConstraint错误。
一、问题代码如下:
let sheet = UIAlertController(title:nil, message: nil, preferredStyle: .actionSheet)
// 本地图片
let cameraAction = UIAlertAction(title: JW_LOCAL(key: "Camera Roll"), style: .default) { (action) in
}
let takePhotoAction = UIAlertAction(title: JW_LOCAL(key: "Take Photo"), style: .default) { (action) in
}
let deleteAction = UIAlertAction(title: JW_LOCAL(key: "Delete Photo"), style: .default) { (action) in
}
let cancelAction = UIAlertAction(title: JW_LOCAL(key: "Cancel"), style: .cancel, handler: nil)
sheet.addAction(takePhotoAction)
sheet.addAction(cameraAction)
sheet.addAction(deleteAction)
sheet.addAction(cancelAction)
self.present(sheet, animated: false, completion: nil)
二、Log输出的error信息:
[LayoutConstraints] Unable to simultaneously satisfy constraints.
Probably at least one of the constraints in the following list is one you don't want.
Try this:
(1) look at each constraint and try to figure out which you don't expect;
(2) find the code that added the unwanted constraint or constraints and fix it.
(
"<NSLayoutConstraint:0x600000495b30 UIView:0x7f9f58e17040.width == - 16 (active)>"
)
Will attempt to recover by breaking constraint
<NSLayoutConstraint:0x600000495b30 UIView:0x7f9f58e17040.width == - 16 (active)>
Make a symbolic breakpoint at UIViewAlertForUnsatisfiableConstraints to catch this in the debugger.
The methods in the UIConstraintBasedLayoutDebugging category on UIView listed in <UIKitCore/UIView.h> may also be helpful.
三、解决方法:
在Sheet的Present之后添加代码如下:就能解决问题
self.present(sheet, animated: false, completion: nil)
// Present之后添加代码如下
sheet.view.subviews.flatMap({$0.constraints}).filter{ (one: NSLayoutConstraint)-> (Bool) in
return (one.constant < 0) && (one.secondItem == nil) && (one.firstAttribute == .width)
}.first?.isActive = false