7

別の上にプログラムで作成した UIView にフェードを適用しようとしています。

[UIView animateWithDuration:0.5 animations:^(void) {
    [self.view setAlpha:0];
}
                 completion:^(BOOL finished){
                     [self.view removeFromSuperview];
                 }];

終了したイベントは正確に 0.5 秒後に適切に呼び出されますが、フェードは表示されません (下部に UIView が表示されるはずです)。

アルファを使用する代わりに、UIView を離すと動作します (上部の UIView がスライドして離れている間に下部の UIView が表示されます)、アルファに関連する問題のようですが、何が問題なのかわかりません!

[UIView animateWithDuration:0.5 animations:^(void) {
    CGRect o = self.view.frame;
    o.origin.x = 320;
    self.view.frame = o;
}
                 completion:^(BOOL finished){
                     [self.view removeFromSuperview];
                 }];

以前はアルファ アニメーションを使用していましたが、通常はこのように動作します...

4

6 に答える 6

7

明示的に設定opaqueしてみてください。NO私の問題を解決したのと同じ問題と設定がありました。どうやら、不透明なビューはアルファでうまく機能しないようです。

ただし、クレジットはHampus Nilssonのコメントにあります。

于 2014-12-28T20:52:19.633 に答える
2

私の場合、スレッドが原因で同じ問題が発生するため、メインスレッドでアニメーションブロックを書き込むことになります。

dispatch_async(dispatch_get_main_queue(), ^{        
    [UIView animateWithDuration:2 delay:0 options:UIViewAnimationOptionLayoutSubviews animations:^{
        View.alpha = 0.0f;
    } completion:^(BOOL finished) {
    }];
});
于 2016-09-15T12:56:24.073 に答える
1

私は正確な問題に遭遇しました。私の場合、最初はビューを非表示にしたかったので、に設定hiddenしましたtruealpha値を変更するとhiddenプロパティが自動的に変更されると思っていましたが、そうではありませんでした。

したがって、最初にビューを非表示にする場合は、それを に設定alpha0ます。

于 2016-05-25T12:31:11.830 に答える
0

私はまったく同じ問題を抱えていましたが、どの提案もうまくいきませんでした。代わりにレイヤーの不透明度を使用して問題を解決しました。これは、レイヤーを表示するためのコードです (Xamarin を使用していますが、アイデアは得られます)。

        //Enter the view fading
        zoomView.Layer.Opacity = 0;

        UIApplication.SharedApplication.KeyWindow.RootViewController.View.Add(zoomView);

        UIView.AnimateNotify(
            0.15, // duration
            () => { zoomView.Layer.Opacity = 1.0f },
            (finished) => { }
        );

これは、同じ zoomView をフェードアウトするためのものです。

UIView.AnimateNotify(
                0.15, // duration
                () => { zoomView.Layer.Opacity = 0; },
                (finished) =>
                {
                    if (finished)
                    {
                        zoomView.RemoveFromSuperview();
                    }
                }
            );
于 2016-07-14T10:54:37.987 に答える
0

パズルのピースがもう 1 つ。コンストレイントをアニメーション化する場合、アニメーション ブロックの外側で新しいコンストレイント定数を設定してから、アニメーションlayoutIfNeeded内で呼び出すことができます。

ビュー アルファでは、これらをアニメーション ブロック内で直接設定する必要があります。

これを変える:

//setup position changes
myConstraint.constant = 10
myOtherConstraint.constant = 10
//whoops, alpha animates immediately
view.alpha = 0.5

UIView.animate(withDuration: 0.25) {
   //views positions are animating, but alpha is not   
   self.view.layoutIfNeeded()
}

//setup position changes
myConstraint.constant = 10
myOtherConstraint.constant = 10

UIView.animate(withDuration: 0.25) {
   view.alpha = 0.5
   self.view.layoutIfNeeded()
}
于 2018-10-02T22:59:57.297 に答える