UINavigationController の UIToolbar に完全にカスタム ボタンを表示し、Portrait と Landscape をサポートしたいと考えています。現在、RotatingButton フレーム全体を埋める 1 つの UIButton を含む RotatingButton (UIView サブクラス) クラスを実装しました。RotatingButton には、縦向きと横向きの 2 つの画像も含まれており、これらの画像の高さは異なります。次に、この RotatingButton がカスタム ビューとして UIBarButtonItem にラップされます。
現在、RotatingButton の layoutSubviews で、ビュー全体の境界を設定し、ボタンを現在の向きに適切な画像に設定しています。これはうまく機能し、必要に応じて回転を処理します。
- (void) createLayout {
[self addButtonIfNeeded];
UIDeviceOrientation currentOrientation = [[UIDevice currentDevice] orientation];
if(UIInterfaceOrientationIsLandscape(currentOrientation)) {
[self.button setImage:self.landscapeImage forState:UIControlStateNormal];
self.button.frame = CGRectMake(0.0, 0.0, self.landscapeImage.size.width / 2, self.landscapeImage.size.height / 2);
self.bounds = CGRectMake(0.0, 0.0, self.landscapeImage.size.width / 2, self.landscapeImage.size.height / 2);
} else {
[self.button setImage:self.portraitImage forState:UIControlStateNormal];
self.button.frame = CGRectMake(0.0, 0.0, self.portraitImage.size.width / 2, self.portraitImage.size.height / 2);
self.bounds = CGRectMake(0.0, 0.0, self.portraitImage.size.width / 2, self.portraitImage.size.height / 2);
}
}
- (void) layoutSubviews {
[super layoutSubviews];
[self createLayout];
}
ただし、この問題は残ります。
- 縦向きの開始ビュー
- ビュー コントローラーをスタックにプッシュする
- デバイスを横向きに回転します (現在のビューは適切に反応します)
- 最後のビュー コントローラーをポップします。前のビューは別の方法で適切に反応しますが、RotatingButtons の layoutSubviews は呼び出されず、ボタンは必要以上に大きくなります。
そのため、現在、View Controller をポップした後、以前の UIBarButtonItems には layoutSubviews が呼び出されておらず、大きすぎるままです (または、横向きから開始して別のビューで縦向きに回転する場合は小さすぎます)。この問題を解決するには?