0

私の目標は、UINavigationBar の左下隅にロゴを追加し、回転時にそこにとどまるように制約を追加することです。

これが私が試したことです:

UIView* navBarView = [[self navigationController] navigationBar];
UIImageView* logoImageView = [[UIImageView alloc] initWithImage:[UIImage imageNamed:@"asdf"]];

[navBarView addSubview:logoImageView];

NSLayoutConstraint *logoConstraintLeftAlign =
    [NSLayoutConstraint constraintWithItem:logoImageView
                                 attribute:NSLayoutAttributeLeft
                                 relatedBy:NSLayoutRelationEqual
                                    toItem:navBarView
                                 attribute:NSLayoutAttributeLeft
                                multiplier:1.0f
                                  constant:0.0f];

NSLayoutConstraint *logoConstraintBottomAlign =
    [NSLayoutConstraint constraintWithItem:logoImageView
                                 attribute:NSLayoutAttributeBottom
                                 relatedBy:NSLayoutRelationEqual
                                    toItem:navBarView
                                 attribute:NSLayoutAttributeBottom
                                multiplier:1.0f
                                  constant:0.0f];

[navBarView addConstraint:logoConstraintLeftAlign];
[navBarView addConstraint:logoConstraintBottomAlign];

ただし、競合する制約に関するエラーが発生します。

2013-10-17 13:34:07.202 WTTest6[6551:a0b] 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. (Note: If you're seeing NSAutoresizingMaskLayoutConstraints that you don't understand, refer to the documentation for the UIView property translatesAutoresizingMaskIntoConstraints) 

(
"<NSLayoutConstraint:0x13196350 UIImageView:0x13198280.bottom == UINavigationBar:0x9d98970.bottom>",
"<NSAutoresizingMaskLayoutConstraint:0x1318a6c0 h=--& v=--& UIImageView:0x13198280.midY == + 12>",
"<NSAutoresizingMaskLayoutConstraint:0x1318a6f0 h=--& v=--& V:[UIImageView:0x13198280(24)]>",
"<NSAutoresizingMaskLayoutConstraint:0x131aa0e0 h=-&- v=--& V:[UINavigationBar:0x9d98970(44)]>"

Will attempt to recover by breaking constraint <NSLayoutConstraint:0x13196350 UIImageView:0x13198280.bottom == UINavigationBar:0x9d98970.bottom>

UIView プロパティ translatesAutoresizingMaskIntoConstraints のドキュメントを参照しましたが、初めて制約を扱っているので、少し圧倒されました。

デフォルトの向きで機能するlogoImageViewのフレームを設定してみました。向きが変わるたびにフレームを変更する必要があると思います。しかし、それは AutoLayout と制約を使用するという点に反するようです。

だから私の質問は、私が望むようにビューを固定するために制約を使用できますか?

UINavigationBar の下部にカスタム UIView を配置するを見ましたが、中央に配置されている UINavigationBarItem の titleView を使用することを提案しているため、左揃えには役立ちません。

4

2 に答える 2

1

最初に、私が見つけたのは、基本的に何かに制約を追加して競合が発生することです。これは、制約を追加するオブジェクトにこれを追加しなかったためです。

[someUIView setTranslatesAutoresizingMaskIntoConstraints:NO];

これをコンテナビューに配置しないでください。サブビューだけに配置してください。

于 2013-10-17T19:22:46.923 に答える