1

「CoverVertical」モーダルセグエを模倣するUIStoryboardSegueを作成しようとしていますが、ビューを「Uncover」にして、セグエが一緒に自然に見えるようにしています。これが私のUIStoryboardSegue子クラスです。

//RetreatVertical.m

#import "RetreatVertical.h"
@implementation RetreatVertical

-(void)perform {
    UIView *oldView = [self.sourceViewController view];
    UIView *newView = [self.destinationViewController view];
    [oldView.window insertSubview:newView belowSubview:oldView];

    [UIView animateWithDuration:0.3 animations:^{
        oldView.center = CGPointMake(oldView.center.x, oldView.center.y + oldView.frame.size.height); }
        completion:^(BOOL finished){ [oldView removeFromSuperview]; }
     ];
}

@end

ユーザーがボタンをタップすると、UIViewControllerがモーダルセグエ「CoverVertical」を使用してスライドしてフォーカスを合わせます。ユーザーが新しいUIViewControllerのボタンをタップすると、そのUIViewControllerが下にスライドして、古いUIViewControllerが表示されます(カスタムセグエ「RetreatVertical」を使用)。それはすべて正常に機能しますが、両方のアニメーションが完了した後に他のボタンまたはインターフェイス要素をタップすると、アプリが「EXC_BAD_ACCESS」でクラッシュします。理由はわかりませんが、過去1時間の検索では何も思いつきませんでした。

ありがとう!

編集: なぜこの戦略が機能しないのですか?

- (void) perform {
    UIView *sourceView = [self.sourceViewController view];
    UIView *destView = [self.destinationViewController view];
    [[self.sourceViewController superview] insertSubview:destView belowSubview:sourceView];

    [UIView animateWithDuration:0.3 animations:^{
        sourceView.center = CGPointMake(sourceView.center.x, sourceView.center.y + sourceView.frame.size.height); }
        completion:^(BOOL finished){ [sourceView removeFromSuperview]; }
     ];
}
4

1 に答える 1

2

アプリケーションウィンドウ(およびそのサブビュー)を直接操作することは、常に注意が必要であり、正しく行うのが非常に困難です。あなたがおそらく説明できない隠されたことがたくさん起こっています。それでは、階層を少し変更して、すべてを簡単にしましょう。

今あなたは持っています:

A =ルートVC

B =新しいVC

遷移: ウィンドウ{ A -----> B }

より良い解決策:

A =ルートVC

B =新しいVC

C =古いVC

遷移:ウィンドウ{ A { C -----> B }}

ルートが単純なVCであり、ビューを上にプッシュする空白のビューがあることを意味します。これにより、メインウィンドウを台無しにすることを心配することなく、好きなアニメーションを簡単に実行できます。

于 2012-10-03T00:06:59.210 に答える