自動レイアウトを有効にしたiOSビューがあり、ツールバーにUIToolbar
とUISearchBar
とUISegmentControl
が含まれています。 UISearchBar
の幅を柔軟にしたいので、これを強制するために制約を追加する必要がありますが、Interface BuilderでUIToolbar
のアイテムに制約を追加することはできません。オプションはすべて無効です。
AutoLayout
以前は、autoresizingmasks
でこれを実現していました。
UIToolbars/UINavigationBars
内の制約は許可されていませんか?
自動レイアウトを使用する場合、他にどのようにこれを達成できますか?
Autolayout制約は、UIViews
とそのサブクラスでのみ機能します。
UIToolbar
はUIView
ベースのアイテム(UISearchBar
やUISegmentedControl
など)を許可しますが、継承しないUIBarButtonItems
と共存する必要がある場合がありますUIView
から。
AutolayoutがUIBarButtonItems
で機能するようになるまで、これまでどおりに実行してください。
代わりに、UIViews
のみに基づくウィジェットを使用して独自のツールバーをロールすることもできます。
これは、ストーリーボードから直接行うこともできます。
ツールバーのアイテムをドラッグアンドドロップし、それらの一部をフレキシブルスペースまたは固定スペースにして、目的の効果を得るだけです。以下の2つの例を参照してください。
注:これは Aligning UIToolBar items に対する私の回答のコピーです。このような解決策を探している間、両方の質問に困惑しました
少なくともコードでこれを行うことができます。私はインターフェイスビルダーを見捨てて、とにかくコードでそれを実行するタイプです。制約の追加や調整に関しては、IBが頻繁に私の邪魔をするようです。これが、カスタムUIToolbar
サブクラスの-initWithFrame:
メソッドで行ったことです。
- (instancetype)initWithFrame:(CGRect)frame {
if (self = [super initWithFrame:frame]) {
[self addSubview:self.label];
[self addConstraint:[NSLayoutConstraint
constraintWithItem:self.label
attribute:NSLayoutAttributeCenterX
relatedBy:NSLayoutRelationEqual
toItem:self
attribute:NSLayoutAttributeCenterX
multiplier:1 constant:0]];
[self addConstraint:[NSLayoutConstraint
constraintWithItem:self.label
attribute:NSLayoutAttributeCenterY
relatedBy:NSLayoutRelationEqual
toItem:self
attribute:NSLayoutAttributeCenterY
multiplier:1 constant:0]];
}
return self;
}
そして、私は可能な限り遅延読み込みをしたいので、ここにself.label
インスタンス変数があります([self addSubview:self.label]
が上記のメッセージを受け取ったときに呼び出されます)。
- (UILabel *)label {
if (_label) return _label;
_label = [UILabel new];
_label.translatesAutoresizingMaskIntoConstraints = NO;
_label.textAlignment = NSTextAlignmentCenter;
return _label;
}
私のために働くようです。 UIBarButtonItems
は追加していませんので、マイレージはさまざまです。