0

私はそれが可能であるかどうか、または神がどれほど明確であるかはわかりませんが、とにかく尋ねようとします.

アプリを作成しようとしていますが、それは Web ページのように見えます。インターフェイスをページと呼びます。

メイン ウィンドウには 7 つのページへの 7 つのリンクがあり、各ページには 2 ~ 3 ページへのリンクがあります。ナビゲーション コントローラーを使用しています。すべてが完璧ですが、少し気になる点があります。

これらのページはすべて同じ背景画像を持っています。ページからページに移動すると、背景画像が正常に変化することがわかります。しかし、ナビゲート中に背景画像の鋭いエッジを見るのは面倒です。ナビゲーション中に背景画像を静止させ、他のものをその上に表示したい。

私の問題を解決するためのトリックはありますか? ストーリーボードを使用するのは非常に簡単なので、この場合非常に多くのビューを処理するのが苦痛になる可能性がある代替ソリューションを試す価値があると思いますか.あなたたちが何をしているか知りたいだけです)

ありがとう、

アルペレン。

4

2 に答える 2

3

私がすることはこれです:

すべてのView Controllerのすべてに、コードにアウトレットを持たせます。VC を閉じるときは、これらすべてをアニメートしてアルファ 0 にします。次に、新しい VC をプッシュします。すべてのアイテムのアルファは 0 で始まり、アニメートして 1 に戻します。 VC がアニメーション化されていない場合、背景画像は変化せず、一貫した背景を維持しながら、最後の画面がフェードアウトし、新しい画面がフェードインするように見えます。

それはあなたが探しているものですか?

より具体的な例を次に示します。

VC1 と VC2 の 2 つのビュー コントローラーがあるとします。VC1 にはフレームの中央に大きなボタン (button1) があり、これを押すと VC2 が起動します。VC2 には、VC1 に戻るための戻るボタン (button2) しかありません。

まず Interface Builder で、ビューの背景画像を VC1 と VC2 の両方で同じ画像に設定します。次に、各 VC にボタンを追加し、それらをヘッダーの適切なアウトレットに接続して、.m ファイルのプロパティを合成します。インターフェイス ビルダーで、各ボタンのアルファをゼロに設定します。それは消えますが、まだそこにあり、目に見えないだけです。

また、ユーザーが各ボタンを押したときのメソッドも作成します。これを VC1 では firstButton、VC2 では backButton と呼びます。これらをボタン 1 とボタン 2 に接続します。

別の方法でコーディングするまで、ボタンは表示されません。そのため、アプリが読み込まれ、画面に VC1 が表示されたら、次のようにボタンの不透明度をアニメーション化する必要があります。アニメーションの構文に慣れていなくても心配はいりません。とても簡単です。

- (void) viewDidAppear:(BOOL)animated {
    // Animations
    [UIView animateWithDuration:0.2     // How long the animation takes
                          delay:0       // Any once we hit this line of code before the animation takes place
                        options:UIViewAnimationCurveEaseInOut  // Play around with this one to see what style of animation you want
                     animations:^{      // This is where we actually say what we want to animate. Make sure you use block syntax like I have here.
                         self.button1.alpha = 1; 
                     } 
                     completion:^ (BOOL finished){}    // If you want to do something else after the animations are complete you can call that here.
     ];
}

以上です!これは、viewDidLoad や viewWillAppear ではなく、viewDidAppear メソッドで行っていることに注意してください。これらは、画面に何かが表示される前に発生し、その時点ではアニメーションを実行できないためです。

ユーザーが VC1 のボタンをタップすると、不透明度をアニメートしてゼロに戻し、VC2 をスタックにプッシュする必要があります。これは前回のアニメーションとほぼ同じですが、今回は完了ブロックで VC2 に変更する必要があります。animation:NO 呼び出しでこれを行うと、最初のビューがスライドアウトすることはありません。背景画像が同じなので、同じ VC にいるように見えます。

- (void) firstButton {
   VC2 *secondVC = [[VC2 alloc] initWithNibName:@"VC2"];
   [UIView animateWithDuration:0.2
                      delay:0
                    options:UIViewAnimationCurveEaseInOut
                 animations:^{ 
                     self.button1.alpha = 0; 
                 } 
                 completion:^ (BOOL finished){ // Presenting the instance of VC2
                     [self.navigationController pushViewController:secondVC animated:NO];
                 }
 ];
}

これで、VC1 のすべてのアニメーションが完成しました。フェードイン効果を VC2 の viewDidAppear メソッド (再度コピーするつもりはありませんが、文字通り同じです) にコピーし、コードを backButton メソッドにコピーする必要があります。これは firstButton メソッドとほぼ同じです。ただし、新しいビュー コントローラーをプッシュするのではなく、ビュー コントローラーをポップする点が異なります。

- (void) backButton {
       [UIView animateWithDuration:0.2
                          delay:0
                        options:UIViewAnimationCurveEaseInOut
                     animations:^{ 
                         self.button2.alpha = 0; 
                     } 
                     completion:^ (BOOL finished){ // Removing the instance of VC2
                         [self.navigationController popViewControllerAnimated:NO];
                     }
     ];
}

それは物事を明確にしますか?

于 2012-06-30T19:50:42.630 に答える
0

要件に合った別の実装を試してください。通常のビューの上で UIScrollView を使用します。通常のビューには背景画像を含めることができ、UIScrollView にはページを含めることができます。

于 2012-06-30T19:36:15.377 に答える