1

私はいくつかのイメージボタンを持つ "ホームスクリーン"を持っています。いずれかのボタンをタップすると、詳細ビ​​ューコントローラがナビコントローラにプッシュされます。しかし、視覚的には、ボタンからの画像を画面上の同じ場所に置いて、新しいビューコントローラーがその背後に移動するようにしたい。新しいViewControllerがナビゲーションコントローラにプッシュされている間、同じ場所に1つのサブビューを保持しますか?

このモーダルコントローラの例は、電子メールまたはメッセージに写真を追加することです。ギャラリー内で選択した写真は、作成メッセージの表示がバックグラウンドで所定の場所にスライドしている間にサイズが大きくなり、写真がメッセージビューの所定位置に縮小されます。私が考え

いくつかのオプション:ボタンをタップしたら

  • は、画像がUIWindowのサブビューとして画面上の同じ場所に配置されています。アニメーション/トランジションを行い、イメージを新しいviewcontrollerのビューのサブビューにします。

  • 上記と同じ

    が、明確な背景

    とモーダルビューコントローラと
  • はUINavigationControllerはサブビューこととUINavigationController

の親ビューでのすべての上記の操作を行い持っています上記のオプションは似ていますが、これを行うためのより良い方法があるのか​​、コードがどこにあるのかが不思議でした。 UINavigationControllerをサブクラス化してトランジションコードをそこに置くべきですか?またはAppDelegate(それは間違っているようだが)?あなたにもModalViewControllerせずにそれを行うことができます

答えて

2

私はナビゲーションコントローラまたはウィンドウのいずれかにサブビューを追加するつもりですが、必要なビュー階層の体操があります。

masterdetailの両方のビューコントローラに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]; 
        }]; 
} 
+0

私は若干の変更を加えましたが、これは非常にうまく動作しています...ありがとう! –

+0

私はこの正確なことをやろうとしていました。 @ Paul.sのテクニックは、もはやiOS7 +で動作しません。ですから、7 +以上の人は、カスタムトランジションを使用する必要があります。 animateTransitionメソッドでは、通常、toViewController.viewをcontainerViewのサブビューとして追加します。その後、imageViewをcontainerViewにサブビューとして追加します。 – Karthik

0
を自分で考えてあなたはビューの「UIViewのアニメーション」を行うことができたり、よりシャープなアニメーションを持っているiCarouselを使用することができます

オプション1

。ビューの遷移が行われると、新しいviewControllerが再度追加され、以前のビューがなくなるため、イメージを削除してから再度pushedViewControllerを削除する必要があります。 これは、プッシュされているviewControllerにNSNotificationを送信し、同じフレームでビューを作成することで行います。また、新しいViewControllerをプッシュする前に、スーパービューからビューを削除することを忘れないでください。

オプション2

心配ビューを持っている必要があり、すべてのviewcontrollersは、単一のViewControllerサブクラスから継承されている場合は、ビューを作成し、viewDidLoadメソッドでそれを追加するには、[スーパーのinit]メソッドを呼び出すことができます。

関連する問題