web-dev-qa-db-ja.com

iOS AutolayoutおよびUIToolbar / UIBarButtonItems

自動レイアウトを有効にしたiOSビューがあり、ツールバーにUIToolbarUISearchBarUISegmentControlが含まれています。 UISearchBarの幅を柔軟にしたいので、これを強制するために制約を追加する必要がありますが、Interface BuilderでUIToolbarのアイテムに制約を追加することはできません。オプションはすべて無効です。

AutoLayout以前は、autoresizingmasksでこれを実現していました。

UIToolbars/UINavigationBars内の制約は許可されていませんか?

自動レイアウトを使用する場合、他にどのようにこれを達成できますか?

23
outerstorm

Autolayout制約は、UIViewsとそのサブクラスでのみ機能します。

UIToolbarUIViewベースのアイテム(UISearchBarUISegmentedControlなど)を許可しますが、継承しないUIBarButtonItemsと共存する必要がある場合がありますUIViewから。

AutolayoutがUIBarButtonItemsで機能するようになるまで、これまでどおりに実行してください。

代わりに、UIViewsのみに基づくウィジェットを使用して独自のツールバーをロールすることもできます。

26
snorock

これは、ストーリーボードから直接行うこともできます。

ツールバーのアイテムをドラッグアンドドロップし、それらの一部をフレキシブルスペースまたは固定スペースにして、目的の効果を得るだけです。以下の2つの例を参照してください。

Evenly spaced

Centered

注:これは Aligning UIToolBar items に対する私の回答のコピーです。このような解決策を探している間、両方の質問に困惑しました

9
Nycen

少なくともコードでこれを行うことができます。私はインターフェイスビルダーを見捨てて、とにかくコードでそれを実行するタイプです。制約の追加や調整に関しては、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は追加していませんので、マイレージはさまざまです。

7
Ben Kreeger