ナビゲーション コントローラーまたはウィンドウにサブビューを追加しますが、必要なビュー階層の体操がいくつかあります。
master
コントローラーとdetail
ビュー コントローラーの両方がimageView
それぞれの ivar を参照できるようにする必要があります。
// PSMasterViewController.m
@interface PSMasterViewController ()
@property (nonatomic, strong) UIImageView *imageView;
@end
@implementation PSMasterViewController
@synthesize imageView = _imageView;
// ...
@end
マスタービューコントローラー用に公開したくないので、これを実装に入れましたが、ニーズは異なる場合があります。
についても同じdetailViewController
// PSDetailViewController.h
@interface PSMasterViewController : UIViewController
@property (nonatomic, strong) UIImageView *imageView;
@end
// PSDetailViewController.m
@implementation PSDetailViewController
@synthesize imageView = _imageView;
// ...
@end
imageView が作成され、マスター ビュー コントローラーに既に表示されていると仮定すると、プッシュしようとするときにいくつかのビュー体操を実装する必要があります。
- (void)methodThatPushesTheNextViewController;
{
CGRect destinationFrame = [self.view convertRect:self.imageView.frame toView:self.navigationController.view];
[self.imageView removeFromSuperview];
[self.navigationController.view addSubview:self.imageView];
self.imageView.frame = destinationFrame;
PSDetailViewController *detailViewController = [[PSDetailViewController alloc] init];
detailViewController.imageView = self.imageView;
self.imageView = nil; // The detailViewController should own this now
[self.navigationController pushViewController:detailViewController animated:YES];
}
ここで、詳細ビュー コントローラーで、今行ったことの反対を行う必要がありviewDidAppear:
ます。特に、移動とスケーリングが必要になる可能性があると述べたように、これは適切な場所です。
- (void)viewDidAppear:(BOOL)animated;
{
[super viewDidAppear:animated];
CGRect startFrame = [self.view convertRect:self.imageView.frame fromView:self.navigationController.view];
[self.imageView removeFromSuperview];
[self.view addSubview:self.imageView];
self.imageView.frame = startFrame;
[UIView animateWithDuration:0.25f
animations:^{
self.imageView.frame = [self someNewFrame];
}];
}