非表示モードを変更しながら、ビューにアニメーションを追加したい、つまり
my_view.hidden=YES;
ナビゲーションバーにボタンを追加しました。それをクリックすると、新しいビューが再表示されるように設定されます。ナビゲーションテーブルの上部に描画します。
非表示モードを変更しながら、ビューにアニメーションを追加したい、つまり
my_view.hidden=YES;
ナビゲーションバーにボタンを追加しました。それをクリックすると、新しいビューが再表示されるように設定されます。ナビゲーションテーブルの上部に描画します。
ビューの不透明度を100%から0%までアニメーション化します。アニメーション完了コールバックでビューを非表示に設定します。また、コールバック中に不透明度を100%にリセットして、再表示するとビューが完全に不透明になるようにすることもできます。
yourView.alpha = 0.0 //for zero opacity
yourView.alpha = 1.0 //for 100% opacity
ただし、非表示にするためのアニメーションはありません。以下の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
})
残念ながら、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];
}
私はそれを行うためのより適切な方法は次のとおりだと思います:
[UIView transitionWithView:aView
duration:0.3
options:UIViewAnimationOptionTransitionCrossDissolve
animations:^(void){
aView.hidden = NO;
}
completion:nil];
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
。
これは、アニメーションを正しくサポートする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
これは修正された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
これはこのための迅速なバージョンです:
スイフト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
これらの回答のいくつかは少し雑然としているので、この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
ここでの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
より複雑なアニメーションタイプまたは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];
}
}
これは、「もっと見る...」と「もっと少なく見る...」ボタンのクリックで「拡大」と「縮小」のビューをモデル化するために使用したコードです。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
}
}