51

非表示モードを変更しながら、ビューにアニメーションを追加したい、つまり

my_view.hidden=YES;

ナビゲーションバーにボタンを追加しました。それをクリックすると、新しいビューが再表示されるように設定されます。ナビゲーションテーブルの上部に描画します。

4

12 に答える 12

61

ビューの不透明度を100%から0%までアニメーション化します。アニメーション完了コールバックでビューを非表示に設定します。また、コールバック中に不透明度を100%にリセットして、再表示するとビューが完全に不透明になるようにすることもできます。

yourView.alpha = 0.0 //for zero opacity
yourView.alpha = 1.0 //for 100% opacity
于 2011-05-30T15:16:24.317 に答える
36

ただし、非表示にするためのアニメーションはありません。以下のSwiftコードでも同じ結果が得られます。

UIView.animate(withDuration: 0.2, delay: 0, options: [], animations: {            
    self.yourView.alpha = 0 // Here you can change the alpha property of the view 
}, completion: { _ in  
    self.yourView.isHidden = true // Here you hide it when animation done
})
于 2014-10-17T17:55:35.283 に答える
31

残念ながら、hiddenは、UIViewアニメーションを介してアニメーション化できるプロパティではありません。@Erik Bが提案したアニメーションのいずれかを使用するか、はるかに強力なCoreAnimationsに手を出すのが最善の策だと思います。UIViewアニメーションとCoreAnimationsのドキュメントをご覧ください。

UIViewアニメーションを使用して新しいビューを別のビューの下からスライドさせることで、あなたの提案のようなものを実現しました。これにより、引き出しが引き出したように見えました。そのようなことをしたい場合は、イベント内の修正をインターセプトし、そこにアニメーションコードを配置する必要があります。

- (IBAction)buttonClicked:(id)sender {
    [UIView animateWithDuration:0.5
                          delay:0.0 
                        options:UIViewAnimationCurveEaseOut
                     animations:^(void) {
                        self.myView.frame = /* set the frame here */
                     } 
                     completion:NULL];
}
于 2011-05-30T15:12:32.457 に答える
22

私はそれを行うためのより適切な方法は次のとおりだと思います:

[UIView transitionWithView:aView
                  duration:0.3
                   options:UIViewAnimationOptionTransitionCrossDissolve 
                animations:^(void){
                              aView.hidden = NO;
                           }
                completion:nil];
于 2015-03-12T05:04:35.610 に答える
20

Swift 3に更新:

UIView.animate(withDuration: 0.2, delay: 0.2, options: .curveEaseOut,
      animations: {firstView.alpha = 0}, 
      completion: { _ in firstView.isHidden = true
        //Do anything else that depends on this animation ending
    })

また、最初のビューがなくなった後で何かをアニメーション化したい場合は、とを使用して完了ブロック内のコードを複製できalpha = 1ますhidden = false

于 2016-12-08T13:44:29.667 に答える
18

これは、アニメーションを正しくサポートするUIViewの新しい「非表示」プロパティを導入するために作成したカテゴリです。

@implementation UIView (AnimateHidden)

-(void)setHiddenAnimated:(BOOL)hide
{
  [UIView animateWithDuration:0.5
                        delay:0.0
                      options: UIViewAnimationCurveEaseOut
                   animations:^
                             {
                           [UIView setAnimationCurve:UIViewAnimationCurveEaseInOut];
                           if (hide)
                             self.alpha=0;
                           else
                           {
                             self.hidden= NO;
                             self.alpha=1;
                           }
                         }
      completion:^(BOOL b)
      {
        if (hide)
          self.hidden= YES;
      }
  ];
}
@end
于 2013-01-04T12:02:42.953 に答える
9

これは修正されたNJバージョンです。

@implementation UIView (AnimateHidden)

-(void)setHiddenAnimated:(BOOL)hide duration:(NSTimeInterval)duration {
    if(self.hidden == hide)
        return;
    if(hide)
        self.alpha = 1;
    else {
        self.alpha = 0;
        self.hidden = NO;
    }
    [UIView animateWithDuration:duration animations:^{
        if (hide)
            self.alpha = 0;
        else
            self.alpha = 1;
    } completion:^(BOOL finished) {
        if(finished)
            self.hidden = hide;
    }];
}

@end
于 2013-05-27T16:01:09.837 に答える
7

これはこのための迅速なバージョンです:

スイフト2

UIView.animateWithDuration(0.5, delay: 0.2, options: UIViewAnimationOptions.CurveEaseOut, animations: {
    objView.alpha = 0
}, completion: { finished in
    objView.hidden = true
})

スウィフト3、4、5

UIView.animate(withDuration: 0.5, delay: 0.2, options: UIView.AnimationOptions.curveEaseOut, animations: {
    objView.alpha = 0
}, completion: { finished in
    objView.isHidden = true
})

これにより、5秒の長さで、2秒の遅延後にアニメーションが実行されます。

使用可能なAnimationOptionsは次のとおりです。

CurveEaseInOut, CurveEaseIn, CurveEaseOut, CurveLinear
于 2016-07-19T12:52:05.830 に答える
4

これらの回答のいくつかは少し雑然としているので、このAPIのミニマルなデザインを投稿できると思いました。また、遅延と期間も追加しました。理由はありません。

実装では、があります。

#import "UIView+AnimateHidden.h"

@implementation UIView (AnimateHidden)

- (void)setHiddenAnimated:(BOOL)hide
                    delay:(NSTimeInterval)delay
                 duration:(NSTimeInterval)duration {
    [UIView animateWithDuration:duration
                          delay:delay
                        options:UIViewAnimationOptionAllowAnimatedContent
                     animations:^{
                         if (hide) {
                             self.alpha = 0;
                         } else {
                             self.alpha = 0;
                             self.hidden = NO; // We need this to see the animation 0 -> 1
                             self.alpha = 1;
                         }
    } completion:^(BOOL finished) {
        self.hidden = hide;
    }];
}

@end

ヘッダーファイルには次のようなものがあります。

#import <UIKit/UIKit.h>

@interface UIView (AnimateHidden)

- (void)setHiddenAnimated:(BOOL)hide
                    delay:(NSTimeInterval)delay
                 duration:(NSTimeInterval)duration;

@end
于 2014-09-07T08:31:16.753 に答える
3

ここでのNJとStanislavの回答は、私がこのための新しいカテゴリを作成するのに役立ちました。これは、彼らの回答を改善すると思うので、他の人に役立つ場合に備えて、私が思いついたものを投稿したいと思いました。

ブロックを使用しているため、iOS4以降でのみ機能することに注意してください。

UIView + AnimationHidden.m

#import "UIView+AnimateHidden.h"

@implementation UIView (AnimateHidden)

- (void)setHidden:(BOOL)hidden animated:(BOOL)animated
{
    // If the hidden value is already set, do nothing
    if (hidden == self.hidden) {
        return;
    }
    // If no animation requested, do the normal setHidden method
    else if (animated == NO) {
        [self setHidden:hidden];
        return;
    }
    else {
        // Store the view's current alpha value
        CGFloat origAlpha = self.alpha;

        // If we're unhiding the view, make it invisible initially
        if (hidden == NO) {
            self.alpha = 0;
        }

        // Unhide the view so we can see the animation
        self.hidden = NO;

        // Do the animation
        [UIView animateWithDuration:0.5
                              delay:0.0
                            options: UIViewAnimationOptionCurveEaseOut
                         animations:^{
            // Start animation block
            if (hidden == YES) {
                self.alpha = 0;
            }
            else {
                self.alpha = origAlpha;
            }
            // End animation block
        }
                        completion:^(BOOL b){
            // Start completion block
            // Finish up by hiding the view if necessary...
            self.hidden = hidden;
            // ... and putting back the correct alpha value
            self.alpha = origAlpha;
            // End completion block
        }];
    }
}

@end
于 2013-12-19T12:42:28.173 に答える
0

より複雑なアニメーションタイプまたはUIViewでサポートされていないアニメーションを使用する場合は、別のバージョン

- (void)setHidden:(BOOL)hidden withAnimationDuration:(NSTimeInterval)duration
{
    CATransition* transition = ({
        CATransition* its = [CATransition animation];
        its.duration = duration;
        its.timingFunction =
            [CAMediaTimingFunction
             functionWithName: kCAMediaTimingFunctionEaseInEaseOut];
        its.type = kCATransitionPush;
        its.subtype = (hidden ? @"fromBottom" : @"fromTop");
        its
    });

    UIView* containerView = self.superview;
    [containerView.layer removeAllAnimations];
    [containerView.layer addAnimation: transition forKey: kCATransition];

    self.hidden = hidden;

    if (!hidden) {
        [self.superview bringSubviewToFront: self];
    }
}
于 2016-02-23T01:00:25.887 に答える
0

これは、「もっと見る...」と「もっと少なく見る...」ボタンのクリックで「拡大」と「縮小」のビューをモデル化するために使用したコードです。Palyancodrからの回答をモデル化

このアプローチにより、ストーリーボードに両方のビューを作成できるため、さまざまなiOSデバイスで制約が期待どおりに機能し、すべての制約をカスタムコーディングする必要がありません。

@IBAction func showMoreOrLessAction(_ sender: Any) {
    // if small view showing
    if showMoreLargeView.isHidden {
        showMoreSmallView.isHidden = true

        //showMoreLargeView.isHidden = false
        UIView.animate(withDuration: 0.2, delay: 0, options: [], animations: {
            self.showMoreLargeView.alpha = 1 // Here you will get the animation you want
        }, completion: { _ in
            self.showMoreLargeView.isHidden = false // Here you hide it when animation done
        })
    }
    else { // large view showing
        //showMoreSmallView.isHidden = false
        UIView.animate(withDuration: 0.2, delay: 0, options: [], animations: {
            self.showMoreSmallView.alpha = 1 // Here you will get the animation you want
        }, completion: { _ in
            self.showMoreSmallView.isHidden = false // Here you hide it when animation done
        })

        showMoreLargeView.isHidden = true
    }
}
于 2017-07-09T13:41:53.880 に答える