1. ホーム
  2. ios

[解決済み] Swift のデフォルト AlertViewController の制約を破る

2023-04-27 03:30:05

質問

デフォルトのAlertViewControllerで、スタイルが .actionSheet . なぜか、このアラートでは 制約エラー . ボタンでalertControllerをトリガー(表示)しない限り、ビュー全体では制約エラーは発生しません。もしかして、これは Xcodeのバグでしょうか?

私が得た正確なエラーは次のようなものです。

2019-04-12 15:33:29.584076+0200 Appname[4688:39368] [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:0x6000025a1e50 UIView:0x7f88fcf6ce60.width == - 16   (active)>"
)

Will attempt to recover by breaking constraint 
<NSLayoutConstraint:0x6000025a1e50 UIView:0x7f88fcf6ce60.width == - 16   (active)>


これは私が使っているコードです。

@objc func changeProfileImageTapped(){
        print("ChangeProfileImageButton tapped!")
        let alert = UIAlertController(title: "Change your profile image", message: nil, preferredStyle: .actionSheet)

        alert.addAction(UIAlertAction(title: "Photo Library", style: .default, handler: nil))
        alert.addAction(UIAlertAction(title: "Online Stock Library", style: .default, handler: nil))
        alert.addAction(UIAlertAction(title: "Cancel", style: .cancel, handler: nil))
        alert.view.tintColor = ColorCodes.logoPrimaryColor

        self.present(alert, animated: true)
    }

ご覧のとおり、これは 非常に基本的な . そのため、私はこのような奇妙な動作に非常に困惑しています。 デフォルトの実装 はエラーを発生させないはずですよね?

制約を破ることによって、アラートはすべてのスクリーン・サイズで適切に表示されますが、私が得るどんな助けにも本当に感謝します。

どのように解決するのですか?

このエラーは致命的なものではなく、Appleの未修正のバグと思われます。この制約がアニメーションスタイルに表示されるのは、プレゼンテーションの直後です。 私は提示の前にそれをキャッチして変更(値、関係、優先順位の変更)しようとしました - この動的に追加された制約のため、成功しませんでした。

でアニメーションをオフにすると self.present(alert, animated: false) でアニメーションをオフにし alert.view.addSubview(UIView()) - を使用すると、エラーが消えます。説明できませんが、うまくいきました!

let alert = UIAlertController(title: "Change your profile image", message: nil, preferredStyle: .actionSheet)

alert.addAction(UIAlertAction(title: "Photo Library", style: .default, handler: nil))
alert.addAction(UIAlertAction(title: "Online Stock Library", style: .default, handler: nil))
let cancel = UIAlertAction(title: "Cancel", style: .destructive, handler: nil)

alert.addAction(cancel)
alert.view.addSubview(UIView()) // I can't explain it, but it works!

self.present(alert, animated: false)