3

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];
}

ただし、この問題は残ります。

  1. 縦向きの開始ビュー
  2. ビュー コントローラーをスタックにプッシュする
  3. デバイスを横向きに回転します (現在のビューは適切に反応します)
  4. 最後のビュー コントローラーをポップします。前のビューは別の方法で適切に反応しますが、RotatingButtons の layoutSubviews は呼び出されず、ボタンは必要以上に大きくなります

そのため、現在、View Controller をポップした後、以前の UIBarButtonItems には layoutSubviews が呼び出されておらず、大きすぎるままです (または、横向きから開始して別のビューで縦向きに回転する場合は小さすぎます)。この問題を解決するには?

4

2 に答える 2

0

完全に満足のいく解決策は見つかりませんでしたが、たまたまボタンが適切なサイズであり、この種の解決策は私にとって非常にうまく機能しました。

UIBarButtonItem* b = [[UIBarButtonItem alloc] initWithTitle:@"" style:UIBarButtonItemStylePlain target:target action:selector];
UIImage *barButton = [portraitImage resizableImageWithCapInsets:UIEdgeInsetsMake(10, 10, 10, 10)];
UIImage *barButton_land = [landscapeImage resizableImageWithCapInsets:UIEdgeInsetsMake(10, 10, 10, 10)];
[b setBackgroundImage:barButton forState:UIControlStateNormal barMetrics:UIBarMetricsDefault];
[b setBackgroundImage:barButton_land forState:UIControlStateNormal barMetrics:UIBarMetricsLandscapePhone];

そして、作成したボタンを rightBarButtonItem/leftBarButtonItem として追加するか、必要に応じて追加します。

これに関する問題は、ボタンの幅が十分でない場合、ボタンが完全に間違って見える可能性があることです (このソリューションでは画像の中央のコンテンツがタイル表示されるため)。

于 2013-03-25T22:34:47.177 に答える