ビュー ストーリーボードで作成されたルート ビュー コントローラーにモーダル ビュー コントローラーを提示すると、変更されていても、ストーリー ボード ビューがフラッシュされます。私のルート ビュー コントローラーには明るい緑色の背景があり、上部に大きな白いサブビューがあり、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];
}];
};
}