間違いなくiOSのバグです。中央のボタンがインストールされると、スタック ビューのサブビューとして追加されますが、配置されたサブビューとしては追加されません。
これが回避策です。中央ボタンのカスタム クラスを に設定しますStackViewBugFixButton
。priorView
次に、中央のボタンの (新しい) アウトレットを左隣のボタンに接続します。の定義は次の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
ビューは、アウトレットが接続される前に、読み込み中にスタック ビューのサブビューとして追加されるため、「以前の兄弟アウトレットを接続するのを忘れていました」という誤った警告が表示されます。