UIAlertViewをランドスケープモードにする

私はランドスケープモードでUIAlertViewを表示する必要があります。私は明らかに、 willPresentAlertView:デリゲートメソッドのトランスフォームを無駄に設定しました。

-(void) willPresentAlertView:(UIAlertView *)alertView {

    alertView.transform = CGAffineTransformMakeRotation(M_PI_2);
}

どのようにこれを修正するための任意の提案?

0

5 答え

didPresentAlertView で試しましたか?

- (void)didPresentAlertView:(UIAlertView *)alertView
{
   //UIAlertView in landscape mode
    [UIView beginAnimations:@"" context:nil];
    [UIView setAnimationDuration:0.1];
    alertView.transform = CGAffineTransformRotate(alertView.transform, 3.14159/2);
    [UIView commitAnimations];
}
2
追加された
didPresentAlertView:では動作しますが、ビューを間違った位置に最初に表示するという望ましくない効果があります。
追加された 著者 cfischer,
3.14159/2を組み込み定数M_PI_2に置き換えると、少し見栄えが良くなります。
追加された 著者 emidander,
これは willPresentAlertView で動作するかもしれませんが、以前は試していません。
追加された 著者 Amit Shah,
willPresentAlertView で動作しますか?もしそうなら、それはおそらくアニメーション効果を取り除くでしょう。
追加された 著者 Amit Shah,
私は willPresentAlertView のバグかもしれないと思うが、デフォルトの背中に戻っているようだ。 didPresentAlertView の内部に、このコードをアニメーションなしで試すことができました。 alertView.transform = CGAffineTransformRotate(alertView.transform、3.14159/2)
追加された 著者 Amit Shah,

アラートを表示するビューの向きは?私は同じ問題を抱えていましたが、UIAlertViewをランドスケープビューの中に表示しようとしましたが、常にポートレートの向きで表示されました。だから、私はステータスバーの方向を強制した:

[[UIApplication sharedApplication] setStatusBarOrientation:theOrientation];

それが私の仕事でした。

1
追加された

UIViewController を使用している場合は、自動的に回転します。 shouldAutorotateToInterfaceOrientation で目的の向きを YES に戻すことを忘れましたか?

- (BOOL)shouldAutorotateToInterfaceOrientation:(UIInterfaceOrientation)interfaceOrientation
{
    return YES; /* auto rotate always */
}
1
追加された
いいえ、私はYESを返していますが、自動回転しません。 :-(
追加された 著者 cfischer,
そうすべき。コントローラの階層が深い場合は、それらのすべてが自動回転を有効にする必要があります。また、ウィンドウレベルで2つ以上のコントローラを使用すると、このような問題が発生する可能性があります。
追加された 著者 djromero,

アラートウィンドウが表示される前に、現在のウィンドウの表示を一番上に設定します。そうしないと、アラートウィンドウの回転アニメーションが表示されます。

-(void) willPresentAlertView:(UIAlertView *)alertView {

    [UIView setAnimationsEnabled:NO];

    self.view.window.windowLevel = 2003;

}

警告ウィンドウを回転する

-(void)didPresentAlertView:(UIAlertView *)alertView
{

    UIWindow * alertWindow = alertView.window;
    alertWindow.transform = CGAffineTransformMakeRotation(M_PI/2);
    alertWindow.bounds = CGRectMake(0, 0, SCREEN_HEIGHT,SCREEN_WIDTH);
    alertWindow.center = CGPointMake(SCREEN_WIDTH/2, SCREEN_HEIGHT/2);

    [NSTimer scheduledTimerWithTimeInterval:0.1 target:self selector:@selector(showLandscapeAlertView) userInfo:nil repeats:NO];

}

Alertウィンドウが回転した後、現在のウィンドウを元に戻します。

-(void)showLandscapeAlertView {

    self.view.window.windowLevel = 0;

    [UIView setAnimationsEnabled:YES];

}
1
追加された
このコードは問題を解決するのに役立つかもしれませんが、なぜおよび/またはそれが質問に答えるかを説明しません。この追加の文脈を提供することは、長期的な教育的価値を大幅に改善するだろう。どのような制限や前提が適用されるかなど、説明を追加するには、回答を編集してください。
追加された 著者 Toby Speight,
チャームのように働く!
追加された 著者 SamuelChan,

私は最近、まったく同じ問題で苦労していました。私のソリューションは UIAlertController を使用していました.- UIAlertview UIActionsheet の古い処理をカバーしていました。

  1. UIAlertController 専用の新しいコントローラを作成します。ここでは、 viewWillAppear メソッドと viewWillDisappear メソッドをオーバーロードする必要があります。 >

AlertViewController.h

#import 

@interface AlertViewController : UIAlertController 

@end

AlertViewController.m

#import "AlertViewController.h"

@interface AlertViewController ()

@end

@implementation AlertViewController

- (void) viewWillAppear:(BOOL)animated {
    [self.view setTransform:CGAffineTransformMakeRotation(M_PI_2)];
}

- (void) viewWillDisappear:(BOOL)animated {
    [self.view setHidden:YES];
}

...
  1. implement method for showing alert view where you needed.

    • (void) showInfoAlertView {

          AlertViewController *alert = [AlertViewController alertControllerWithTitle:@"My Alert" message:@"This is an alert." preferredStyle:UIAlertControllerStyleAlert];
      
          UIAlertAction* ok = [UIAlertAction actionWithTitle:@"OK" style:UIAlertActionStyleDefault handler:nil];
          [alert addAction:ok];
          [self presentViewController:alert animated:NO completion:nil];
      }
      
0
追加された