私はナビゲーションコントローラまたはウィンドウのいずれかにサブビューを追加するつもりですが、必要なビュー階層の体操があります。
master
とdetail
の両方のビューコントローラにimageView
の参照を持つ手段を提供する必要があります。
// PSMasterViewController.m
@interface PSMasterViewController()
@property (nonatomic, strong) UIImageView *imageView;
@end
@implementation PSMasterViewController
@synthesize imageView = _imageView;
// ...
@end
マスタービューコントローラでパブリックにすることは気にしませんが、ニーズが異なる可能性があるため、これを実装に入れました。今ImageViewのが作成され、我々は我々が押ししようとしているとき、いくつかのビューの体操を実装する必要があるマスター・ビュー・コントローラに既に提示されていることを想定しdetailViewController
// PSDetailViewController.h
@interface PSMasterViewController : UIViewController
@property (nonatomic, strong) UIImageView *imageView;
@end
// PSDetailViewController.m
@implementation PSDetailViewController
@synthesize imageView = _imageView;
// ...
@end
ため、再び同じ
- (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];
}];
}
私は若干の変更を加えましたが、これは非常にうまく動作しています...ありがとう! –
私はこの正確なことをやろうとしていました。 @ Paul.sのテクニックは、もはやiOS7 +で動作しません。ですから、7 +以上の人は、カスタムトランジションを使用する必要があります。 animateTransitionメソッドでは、通常、toViewController.viewをcontainerViewのサブビューとして追加します。その後、imageViewをcontainerViewにサブビューとして追加します。 – Karthik