1

中央のボタンが異なるサイズのクラスのストーリーボード ビューでのみ表示される UIStackView があり ます。

デバイスを回転させた後、ボタンはサイズ クラスのために表示され、右側のビュー階層 (画像) にもありますが、正しく配置するために UIstackview によって与えられた十分な制約がなく、左上隅に配置されます (ラベル真ん中)。

制約が足りない

機能するボタン (サイズ クラスの変更の影響を受けない) には、さらに多くの制約があります。

これはバグですか、それとも何か不足していますか。誰かが回避策を知っていますか?

4

4 に答える 4

3

間違いなくiOSのバグです。中央のボタンがインストールされると、スタック ビューのサブビューとして追加されますが、配置されたサブビューとしては追加されません。

これが回避策です。中央ボタンのカスタム クラスを に設定しますStackViewBugFixButtonpriorView次に、中央のボタンの (新しい) アウトレットを左隣のボタンに接続します。の定義は次のStackViewBugFixButtonとおりです。

StackViewBugFixButton.h

#import <UIKit/UIKit.h>

@interface StackViewBugFixButton : UIButton

@property (nonatomic, weak) IBOutlet UIView *priorSibling;

@end

StackViewBugFixButton.m

#import "StackViewBugFixButton.h"

@implementation StackViewBugFixButton

- (void)didMoveToSuperview {
    [super didMoveToSuperview];
    [self putIntoArrangedSubviewsIfNeeded];
}

- (void)putIntoArrangedSubviewsIfNeeded {
    if (![self.superview isKindOfClass:[UIStackView class]]) {
        return;
    }

    if (self.priorSibling == nil) {
        NSLog(@"%@ %s You forgot to hook up my priorSibling outlet.", self, __func__);
        return;
    }

    UIStackView *stackView = (UIStackView *)self.superview;
    if ([stackView.arrangedSubviews indexOfObject:self] != NSNotFound) {
        return;
    }

    NSUInteger priorSiblingIndex = [stackView.arrangedSubviews indexOfObject:self.priorSibling];
    if (priorSiblingIndex == NSNotFound) {
        NSLog(@"%@ %s My priorSibling isn't in my superview's arrangedSubviews.", self, __func__);
        return;
    }

    [stackView insertArrangedSubview:self atIndex:priorSiblingIndex + 1];
}

@end

ビューは、アウトレットが接続される前に、読み込み中にスタック ビューのサブビューとして追加されるため、「以前の兄弟アウトレットを接続するのを忘れていました」という誤った警告が表示されます。

于 2015-11-04T17:03:19.810 に答える