1

多数の画像ボタンを備えた「ホーム画面」があります。ボタンの 1 つをタップすると、詳細ビ​​ュー コントローラーが navcontroller にプッシュされます。ただし、視覚的には、新しいビューコントローラーがその背後に移動する間、ボタンからの画像を画面上の同じ場所にとどめたいと思います。

モーダル コントローラーを使用したこの例は、電子メールまたはメッセージに写真を追加することです。ギャラリーで選択した写真のサイズが大きくなり (手前に移動しているかのように)、作成メッセージ ビューが背景の所定の位置にスライドし、写真が縮小してメッセージ ビューの所定の位置に収まります。

私が考えたいくつかのオプション:

  • ボタンをタップすると、画像が UIWindow のサブビューとして画面上の同じ場所に配置されます。アニメーション/トランジションを実行してから、画像を新しいビューコントローラーのビューのサブビューにします。

  • 上記と同じですが、背景がクリアなモーダル ビュー コントローラーを使用します。

  • UINavigationController をサブビューにして、UINavigationController の親ビューで上記を実行します

上記のオプションはすべて似ていますが、これを行うためのより良い方法があるかどうか、およびコードがどこにあるかについて興味がありました。UINavigationController をサブクラス化し、そこに遷移コードを配置する必要がありますか? それとも、AppDelegate (間違っているようですが) でしょうか?

4

3 に答える 3

2

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

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];
                     }];
}
于 2012-05-12T22:54:32.727 に答える
0

オプション1

ModalViewController がなくても実行できます。最初に覚えておくべきことは、画像を削除してから再度 pushViewController に移動する必要があるということです。これは、ビューの遷移が発生すると、新しい viewController が再び追加され、以前のビューが失われるためです。したがって、プッシュされているviewControllerにNSNotificationを送信し、同じフレームでビューを作成することでこれを行います。また、新しい ViewController をプッシュする前に、スーパービューからビューを削除することを忘れないでください。

オプション2

関連するビューを持つ必要があるすべてのビューコントローラーが単一の ViewController サブクラスから継承されている場合は、[super init] メソッドを呼び出してビューを作成し、それを viewDidLoad メソッドに追加できます。

于 2012-05-12T21:41:03.553 に答える
-1

あなたはあなたが思いついたようにビューで「UIViewアニメーション」を行うことができます、あるいはあなたはより鋭いアニメーションicarouselSourceCodeを持つためにiCarouselを使うことができます

于 2012-05-12T21:09:00.947 に答える