1

ビュー ストーリーボードで作成されたルート ビュー コントローラーにモーダル ビュー コントローラーを提示すると、変更されていても、ストーリー ボード ビューがフラッシュされます。私のルート ビュー コントローラーには明るい緑色の背景があり、上部に大きな白いサブビューがあり、IBOutlet にバインドされたラベルが含まれています。UIViewController viewDidLoad では、viewcontroller のビューのサブビューとしてビュー全体をカバーする明るい灰色のわずかに透明な UIView を追加しています。また、ストーリーボード レイアウトとは異なるラベル テキストを設定しています。

セグエまたは presentViewController:completion を介してモーダルをトリガーすると、ラベルの上に明るい灰色のビューが表示され、コードに追加されたビューが透明になり、アニメーションで離れて、ストーリーボード レイアウトの明るい緑色が表示され、次に、モーダル ビューがクロス ディゾルブします。最初のビューを閉じて、完了ブロックで 2 番目のビューを表示すると、クロス ディゾルブが明るい緑色になり、追加されたビューが再び表示されると光がポップし、明るい緑色にポップし、クロスが表示されます。 -2 番目のビュー コントローラーのビューにディゾルブします。

2 番目のビュー コントローラーを閉じると、クロス ディゾルブして明るい緑色になり、追加されたライト グレーの半透明のビューがポップして表示されるようになります。

コードで追加されたビューの下にクロスディゾルブがビューを表示しないようにする方法を知っている人はいますか?

この例は、viewDidLoad に追加されたオーバーレイ ビューから不透明度を削除すると、さらに不快になります。

https://github.com/jonnolen/ios-cross-disolve-problem

コード スニペットとストーリー ボードのレイアウト:

ここに画像の説明を入力

@interface DTViewController (){
    BOOL hasShownSegue;
}

@end

@implementation DTViewController

- (void)viewDidLoad
{
    [super viewDidLoad];

    UIView * view = [UIView new];

    view.frame = self.view.bounds;
    view.backgroundColor = [UIColor colorWithWhite:.95 alpha:.7];

    NSLog(@"View Bounds: %@", NSStringFromCGRect(self.view.bounds));

    [self.view addSubview:view];
    self.label.text = @"Hello!";
}

-(void)viewDidAppear:(BOOL)animated{
    [super viewDidAppear:animated];
    if (!hasShownSegue){
        [self performSegueWithIdentifier:@"modal.1.segue" sender:self];
        hasShownSegue = YES;
    }
}

-(void)prepareForSegue:(UIStoryboardSegue *)segue sender:(id)sender{
    DTCallbackViewController *vc = segue.destinationViewController;

    vc.completionCallback = ^{
        [self dismissViewControllerAnimated:YES completion:^{
            DTCallbackViewController * vc = [self.storyboard instantiateViewControllerWithIdentifier:@"vc.2"];

            vc.completionCallback = ^{
                [self dismissViewControllerAnimated:YES completion:nil];
            };

            [self presentViewController:vc animated:YES completion:nil];

        }];
    };
}
4

1 に答える 1

1

それを考え出した、私はそれがあまり好きではありませんが、うまくいきます:

マスク可能なすべてのコンテンツを別のビューに配置します。

ここに画像の説明を入力

そして、「マスク」する必要があるときにそのビューを非表示にします。

- (void)viewDidLoad
{
    [super viewDidLoad];
    NSLog(@"View Bounds: %@", NSStringFromCGRect(self.view.bounds));
    self.label.text = @"Hello!";
    self.content.hidden = YES;
}

その後、アニメーションは期待どおりに動作します。ただし、これは不透明なマスクでのみ機能します(これが必要でした)。

于 2013-01-16T17:04:04.317 に答える