অ্যানিমেশন সহ ইউআইভিউ লুকান / প্রদর্শন করুন


154

আমার সহজ লক্ষ্য হ'ল অ্যানিমেট লুকানো এবং দেখানো ফাংশন বিবর্ণ করা।

Button.hidden = YES;

যথেষ্ট সহজ। যাইহোক, এটি কেবল অদৃশ্য হওয়ার পরিবর্তে কী বিবর্ণ হওয়া সম্ভব? এটি সেভাবে বরং অপেশাদারী দেখায়।

উত্তর:


258

আইওএস 4 এবং তারপরে, কোয়ার্টজকোর আমদানি করার প্রয়োজন ছাড়াই কেবল ইউআইভিউ রূপান্তর পদ্ধতিটি ব্যবহার করে এটি করার একটি উপায় রয়েছে। আপনি কেবল বলতে পারেন:

উদ্দেশ্য গ

[UIView transitionWithView:button
                  duration:0.4
                   options:UIViewAnimationOptionTransitionCrossDissolve
                animations:^{
                     button.hidden = YES;
                }
                completion:NULL];

দ্রুতগতি

UIView.transition(with: button, duration: 0.4, 
                  options: .transitionCrossDissolve, 
                  animations: {
                 button.hidden = false
              })

পূর্ববর্তী সমাধান

মিশেলের সমাধানগুলি কাজ করবে, তবে এটি আসলে সেরা পদ্ধতির নয়।

আলফা ফেইডিংয়ের সমস্যাটি হ'ল কখনও কখনও বিভিন্ন ওভারল্যাপিং ভিউ স্তরগুলি বিবর্ণ হওয়ার সাথে সাথে অদ্ভুত দেখায়। কোর অ্যানিমেশন ব্যবহার করে আরও কিছু বিকল্প রয়েছে। প্রথমে আপনার অ্যাপে কোয়ার্টজোর ফ্রেমওয়ার্ক অন্তর্ভুক্ত করুন #import <QuartzCore/QuartzCore.h>এবং আপনার শিরোনামে যুক্ত করুন। এখন আপনি নিম্নলিখিতগুলির মধ্যে একটি করতে পারেন:

1) সেট করুন button.layer.shouldRasterize = YES;এবং তারপরে মাইচাইল তার উত্তরে প্রদত্ত আলফা অ্যানিমেশন কোডটি ব্যবহার করুন। এটি স্তরগুলিকে অদ্ভুতভাবে মিশ্রণ হতে বাধা দেবে, তবে এতে সামান্য পারফরম্যান্স পেনাল্টি রয়েছে এবং এটি যদি পিক্সেলের সীমানায় একসাথে ঠিক না থাকে তবে বোতামটি ঝাপসা দেখায়।

বিকল্পভাবে:

2) পরিবর্তে বিবর্ণ সঞ্চার করতে নিম্নলিখিত কোডটি ব্যবহার করুন:

CATransition *animation = [CATransition animation];
animation.type = kCATransitionFade;
animation.duration = 0.4;
[button.layer addAnimation:animation forKey:nil];

button.hidden = YES;

এই পদ্ধতির দুর্দান্ত জিনিস হ'ল আপনি বোতামের যে কোনও সম্পত্তি অ্যানিমেটেবল (যেমন বোতামের পাঠ্য বা চিত্র) না থাকলেও ক্রসফেইড করতে পারেন, কেবলমাত্র স্থানান্তর সেট আপ করুন এবং তারপরে তত্ক্ষণাত আপনার বৈশিষ্ট্যগুলি সেট করুন।


5
@ অরবম্যাথারস, আমি আপনার কোডটি পরীক্ষা করে দেখছি, উপরে দুটি কোড ঠিক তখন কাজ করবে যখন বাটন হিডেন = না, পরিস্থিতিতে বিবর্ণ হওয়ার জন্য; বাটন হিডেন = ইয়েস ফিড আউট করার জন্য কোনও অ্যানিমেশন প্রভাব নেই;
জেসন

আইওএস 12.0 এ ভাঙ্গা বলে মনে হচ্ছে
ব্যবহারকারী 3532505

5
আপনি যে transitionWithViewপ্যারামিটার হিসাবে অ্যানিমেট করছেন সেটির সুপারভিউটি আপনার সফল ফিড ইন এবং আউট নিশ্চিত করতে হবে।
অ্যালেনহ

159

ইউআইভিউ অ্যানিমেটেড বৈশিষ্ট্যগুলি হ'ল:

- frame
- bounds
- center
- transform
- alpha
- backgroundColor
- contentStretch

এতে বর্ণনা করুন: অ্যানিমেশন

isHidden এগুলির মধ্যে একটি নয়, তাই আমি যেমন দেখছি সর্বোত্তম উপায় হ'ল:

সুইফট 4:

func setView(view: UIView, hidden: Bool) {
    UIView.transition(with: view, duration: 0.5, options: .transitionCrossDissolve, animations: {
        view.isHidden = hidden
    })
}

উদ্দেশ্য গ:

- (void)setView:(UIView*)view hidden:(BOOL)hidden {
    [UIView transitionWithView:view duration:0.5 options:UIViewAnimationOptionTransitionCrossDissolve animations:^(void){
        [view setHidden:hidden];
    } completion:nil];
}

8
আসলে এটিই সহজ এবং সর্বোত্তম উত্তর
ইরশাদ মোহাম্মদ

3
এই অ্যানিমেটগুলি সঠিকভাবে চলাকালীন, অ্যানিমেশনটি সম্পূর্ণ না হওয়া এবং তত্ক্ষণাত তত্ক্ষণাত্ সঠিক অবস্থানে না আসা পর্যন্ত আমি যে ইউআইএসবারবারটি প্রদর্শন করার চেষ্টা করছি তা ভুল জায়গায় উপস্থিত হবে। কোন ধারণা? আমি ইন্টারফেস বিল্ডার এবং সীমাবদ্ধতার সাথে স্টোরিবোর্ডগুলি ব্যবহার করছি।
গ্রেগ হিলস্টন

5
এই কোডটি কাজ করে না ... এটি অ্যানিমেশন ছাড়াই রাষ্ট্র পরিবর্তন করে
মিহির মেহতা

2
@ এ্যাভ্যা যখন লুকিয়ে থাকবে তখনই ফিড ইন করার জন্য কাজ করুন = কোনও নেই ade বিবর্ণ হওয়ার জন্য কাজ করছেন না, লুকানো = হ্যাঁ
জেসন

অসাধারণ. 10x অনেক কিছু
ভায়াচ্লাভ

124

বিবর্ণ হওয়া:

উদ্দেশ্য গ

[UIView animateWithDuration:0.3 animations:^{
    button.alpha = 0;
} completion: ^(BOOL finished) {//creates a variable (BOOL) called "finished" that is set to *YES* when animation IS completed.
    button.hidden = finished;//if animation is finished ("finished" == *YES*), then hidden = "finished" ... (aka hidden = *YES*)
}];

সুইফট 2

UIView.animateWithDuration(0.3, animations: {
    button.alpha = 0
}) { (finished) in
    button.hidden = finished
}

সুইফট 3, 4, 5

UIView.animate(withDuration: 0.3, animations: {
    button.alpha = 0
}) { (finished) in
    button.isHidden = finished
}

বিবর্ণ করতে:

উদ্দেশ্য গ

button.alpha = 0;
button.hidden = NO;
[UIView animateWithDuration:0.3 animations:^{
    button.alpha = 1;
}];

সুইফট 2

button.alpha = 0
button.hidden = false
UIView.animateWithDuration(0.3) {
    button.alpha = 1
}

সুইফট 3, 4, 5

button.alpha = 0
button.isHidden = false
UIView.animate(withDuration: 0.3) {
    button.alpha = 1
}

লুকানো অবস্থার সাথে মিলে
ফিড

কোনও কারণে, লুকানোতে = এঁকে অ্যানিমেট করা আমার পক্ষে ভাল কাজ করেছে তবে লুকানোতে অ্যানিমেট করা = কিছুই করেনি, তাই আলফাটিকে অ্যানিমেট করা এবং লুকানো সম্পত্তি সেট করার এই সমন্বয় সহায়ক ছিল।
আরলোমেডিয়া

আমি কেবল একটি ডেমো লিখি, তবে কেবল লুকানো = নেই, কাজগুলিতে বিবর্ণ, অদ্ভুত
জেসন

9

আমি এই ছোট্ট সুইফট 3 এক্সটেনশনটি ব্যবহার করি :

extension UIView {

  func fadeIn(duration: TimeInterval = 0.5,
              delay: TimeInterval = 0.0,
              completion: @escaping ((Bool) -> Void) = {(finished: Bool) -> Void in }) {
    UIView.animate(withDuration: duration,
                   delay: delay,
                   options: UIViewAnimationOptions.curveEaseIn,
                   animations: {
      self.alpha = 1.0
    }, completion: completion)
  }

  func fadeOut(duration: TimeInterval = 0.5,
               delay: TimeInterval = 0.0,
               completion: @escaping (Bool) -> Void = {(finished: Bool) -> Void in }) {
    UIView.animate(withDuration: duration,
                   delay: delay,
                   options: UIViewAnimationOptions.curveEaseIn,
                   animations: {
      self.alpha = 0.0
    }, completion: completion)
  }
}

7

সুইফট 3

func appearView() {
     self.myView.alpha = 0
     self.myView.isHidden = false

     UIView.animate(withDuration: 0.9, animations: {
         self.myView.alpha = 1
     }, completion: {
         finished in
         self.myView.isHidden = false
     })
}

7

দ্রুত 4.2

এক্সটেনশন সহ:

extension UIView {
func hideWithAnimation(hidden: Bool) {
        UIView.transition(with: self, duration: 0.5, options: .transitionCrossDissolve, animations: {
            self.isHidden = hidden
        })
    }
}

সহজ পদ্ধতি:

func setView(view: UIView, hidden: Bool) {
    UIView.transition(with: view, duration: 0.5, options: .transitionCrossDissolve, animations: {
        view.isHidden = hidden
    })
}

আমি কীভাবে এইটির জন্য বিলম্ব করতে পারি?
সিভিডোগান

7

মসৃণ ফিডআউট এবং ফেডইন ইফেক্টগুলির জন্য এই সমাধানটি ব্যবহার করুন

extension UIView {
    func fadeIn(duration: TimeInterval = 0.5, delay: TimeInterval = 0.0, completion: @escaping ((Bool) -> Void) = {(finished: Bool) -> Void in }) {
        self.alpha = 0.0

        UIView.animate(withDuration: duration, delay: delay, options: UIView.AnimationOptions.curveEaseIn, animations: {
            self.isHidden = false
            self.alpha = 1.0
        }, completion: completion)
    }

    func fadeOut(duration: TimeInterval = 0.5, delay: TimeInterval = 0.0, completion: @escaping (Bool) -> Void = {(finished: Bool) -> Void in }) {
        self.alpha = 1.0

        UIView.animate(withDuration: duration, delay: delay, options: UIView.AnimationOptions.curveEaseOut, animations: {
            self.isHidden = true
            self.alpha = 0.0
        }, completion: completion)
    }
}

ব্যবহার যেমন হয়

uielement.fadeIn()
uielement.fadeOut()

ধন্যবাদ


fadeOutআইওএস 13 এ কাজ করে তবেই আমি সেটগুলি যে লাইনগুলি সরিয়েছি self.isHidden
মাইক Taverne

6

আমি বিভাগ নির্মিত UIViewএই কাজের জন্য এবং বাস্তবায়িত একটি বিশেষ একটু ভিন্ন ধারণা বিট: visibility। আমার সমাধানের মূল পার্থক্য হ'ল আপনি কল করতে পারেন [view setVisible:NO animated:YES]এবং ঠিক তার পরে সিঙ্ক্রোনালি পরীক্ষা করে [view visible]সঠিক ফলাফল পেতে পারেন। এটি বেশ সহজ তবে অত্যন্ত দরকারী।

তদতিরিক্ত, এটি "নেতিবাচক বুলিয়ান যুক্তি" ব্যবহার এড়াতে পারবেন ( কোড সম্পূর্ণ, পৃষ্ঠা 269 দেখুন, আরও তথ্যের জন্য ইতিবাচক বুলিয়ান পরিবর্তনশীল নাম ব্যবহার করুন)।

দ্রুতগতি

UIView+Visibility.swift

import UIKit


private let UIViewVisibilityShowAnimationKey = "UIViewVisibilityShowAnimationKey"
private let UIViewVisibilityHideAnimationKey = "UIViewVisibilityHideAnimationKey"


private class UIViewAnimationDelegate: NSObject {
    weak var view: UIView?

    dynamic override func animationDidStop(animation: CAAnimation, finished: Bool) {
        guard let view = self.view where finished else {
            return
        }

        view.hidden = !view.visible
        view.removeVisibilityAnimations()
    }
}


extension UIView {

    private func removeVisibilityAnimations() {
        self.layer.removeAnimationForKey(UIViewVisibilityShowAnimationKey)
        self.layer.removeAnimationForKey(UIViewVisibilityHideAnimationKey)
    }

    var visible: Bool {
        get {
            return !self.hidden && self.layer.animationForKey(UIViewVisibilityHideAnimationKey) == nil
        }

        set {
            let visible = newValue

            guard self.visible != visible else {
                return
            }

            let animated = UIView.areAnimationsEnabled()

            self.removeVisibilityAnimations()

            guard animated else {
                self.hidden = !visible
                return
            }

            self.hidden = false

            let delegate = UIViewAnimationDelegate()
            delegate.view = self

            let animation = CABasicAnimation(keyPath: "opacity")
            animation.fromValue = visible ? 0.0 : 1.0
            animation.toValue = visible ? 1.0 : 0.0
            animation.fillMode = kCAFillModeForwards
            animation.removedOnCompletion = false
            animation.delegate = delegate

            self.layer.addAnimation(animation, forKey: visible ? UIViewVisibilityShowAnimationKey : UIViewVisibilityHideAnimationKey)
        }
    }

    func setVisible(visible: Bool, animated: Bool) {
        let wereAnimationsEnabled = UIView.areAnimationsEnabled()

        if wereAnimationsEnabled != animated {
            UIView.setAnimationsEnabled(animated)
            defer { UIView.setAnimationsEnabled(!animated) }
        }

        self.visible = visible
    }

}

উদ্দেশ্য গ

UIView+Visibility.h

#import <UIKit/UIKit.h>

@interface UIView (Visibility)

- (BOOL)visible;
- (void)setVisible:(BOOL)visible;
- (void)setVisible:(BOOL)visible animated:(BOOL)animated;

@end

UIView+Visibility.m

#import "UIView+Visibility.h"

NSString *const UIViewVisibilityAnimationKeyShow = @"UIViewVisibilityAnimationKeyShow";
NSString *const UIViewVisibilityAnimationKeyHide = @"UIViewVisibilityAnimationKeyHide";

@implementation UIView (Visibility)

- (BOOL)visible
{
    if (self.hidden || [self.layer animationForKey:UIViewVisibilityAnimationKeyHide]) {
        return NO;
    }

    return YES;
}

- (void)setVisible:(BOOL)visible
{
    [self setVisible:visible animated:NO];
}

- (void)setVisible:(BOOL)visible animated:(BOOL)animated
{
    if (self.visible == visible) {
        return;
    }

    [self.layer removeAnimationForKey:UIViewVisibilityAnimationKeyShow];
    [self.layer removeAnimationForKey:UIViewVisibilityAnimationKeyHide];

    if (!animated) {
        self.alpha = 1.f;
        self.hidden = !visible;
        return;
    }

    self.hidden = NO;

    CGFloat fromAlpha = visible ? 0.f : 1.f;
    CGFloat toAlpha = visible ? 1.f : 0.f;
    NSString *animationKey = visible ? UIViewVisibilityAnimationKeyShow : UIViewVisibilityAnimationKeyHide;

    CABasicAnimation *animation = [CABasicAnimation animationWithKeyPath:@"opacity"];
    animation.duration = 0.25;
    animation.fromValue = @(fromAlpha);
    animation.toValue = @(toAlpha);
    animation.delegate = self;
    animation.removedOnCompletion = NO;
    animation.fillMode = kCAFillModeForwards;
    [self.layer addAnimation:animation forKey:animationKey];
}

#pragma mark - CAAnimationDelegate

- (void)animationDidStop:(CAAnimation *)animation finished:(BOOL)finished
{
    if ([[self.layer animationForKey:UIViewVisibilityAnimationKeyHide] isEqual:animation]) {
        self.hidden = YES;
    }
}

@end

@ ভ্যালেন্টিন শেরগিন সুইফট ভার্সন আসছে?
হুয়ান বোয়েরো

নিশ্চিত! আমি সুইফট সংস্করণ যুক্ত করেছি।
ভ্যালেন্টিন শেরগিন

5

@ উমির আফজালের কোড কিছু পরিবর্তন করার পরে 5 এ সুইফটে সূক্ষ্মভাবে কাজ করছে

 extension UIView {

func fadeIn(duration: TimeInterval = 0.5, delay: TimeInterval = 0.0, completion: @escaping ((Bool) -> Void) = {(finished: Bool) -> Void in }) {
    self.alpha = 0.0

    UIView.animate(withDuration: duration, delay: delay, options: UIView.AnimationOptions.curveEaseIn, animations: {
        self.isHidden = false
        self.alpha = 1.0
    }, completion: completion)
}

func fadeOut(duration: TimeInterval = 0.5, delay: TimeInterval = 0.0, completion: @escaping (Bool) -> Void = {(finished: Bool) -> Void in }) {
    self.alpha = 1.0

    UIView.animate(withDuration: duration, delay: delay, options: UIView.AnimationOptions.curveEaseIn, animations: {
        self.alpha = 0.0
    }) { (completed) in
        self.isHidden = true
        completion(true)
    }
  }
}

ব্যবহারের জন্য

yourView.fadeOut()
yourView.fadeIn()

বিবর্ণ হওয়ার সময় কিছু শক্ত প্রভাব দেওয়া, আরও কিছু ভাল সমাধান এখানে
ধনু কে

4

সুইফট 4

extension UIView {

func fadeIn(duration: TimeInterval = 0.5, delay: TimeInterval = 0.0, completion: @escaping ((Bool) -> Void) = {(finished: Bool) -> Void in }) {
    self.alpha = 0.0

    UIView.animate(withDuration: duration, delay: delay, options: UIViewAnimationOptions.curveEaseIn, animations: {
        self.isHidden = false
        self.alpha = 1.0
    }, completion: completion)
}

func fadeOut(duration: TimeInterval = 0.5, delay: TimeInterval = 0.0, completion: @escaping (Bool) -> Void = {(finished: Bool) -> Void in }) {
    self.alpha = 1.0

    UIView.animate(withDuration: duration, delay: delay, options: UIViewAnimationOptions.curveEaseIn, animations: {
        self.alpha = 0.0
    }) { (completed) in
        self.isHidden = true
        completion(true)
    }
}
}

এবং এটি ব্যবহার করতে, সাধারণভাবে এই ফাংশনগুলিতে কল করুন:

yourView.fadeOut() // this will hide your view with animation
yourView.fadeIn() /// this will show your view with animation

আপনি কেবলমাত্র @ মার্কমেকেলভিয়ের উত্তরটি অনুলিপি করেছেন
অ্যাশলে মিলস

একটি পার্থক্য আছে, তিনি দৃশ্যটি লুকিয়ে রাখছিলেন না। এবং আমার ভিউটিও লুকিয়ে রাখা দরকার। তাই এটি এবং ভাগ করে নিন।
উমাইর আফজাল

3
অন্য উত্তরটি অনুলিপি করার পরিবর্তে এবং নিজের হিসাবে চলে যাওয়ার পরিবর্তে কেন মন্তব্য করবেন না?
অ্যাশলে মিলস

2

isHidden একটি তাত্ক্ষণিক মান এবং আপনি এটিতে কোনও অ্যানিমেশনকে প্রভাবিত করতে পারবেন না, এর পরিবর্তে আপনি নিজের দৃষ্টিভঙ্গিটি আড়াল করার জন্য আলফা ব্যবহার করতে পারেন

UIView.transition(with: view, duration: 0.5, options: .transitionCrossDissolve, animations: {
        view.alpha = 0
    })

এবং দেখানোর জন্য:

UIView.transition(with: view, duration: 0.5, options: .transitionCrossDissolve, animations: {
      view.alpha = 1
})


1
func flipViews(fromView: UIView, toView: UIView) {

    toView.frame.origin.y = 0

    self.view.isUserInteractionEnabled = false

    UIView.transition(from: fromView, to: toView, duration: 0.5, options: .transitionFlipFromLeft, completion: { finished in            

        fromView.frame.origin.y = -900

        self.view.isUserInteractionEnabled = true

    })


}

1

আপনি এটি চেষ্টা করতে পারেন।

 func showView(objView:UIView){

    objView.alpha = 0.0
    UIView.animate(withDuration: 0.5, animations: {
        objView.alpha = 0.0
    }, completion: { (completeFadein: Bool) -> Void in
        objView.alpha = 1.0
        let transition = CATransition()
        transition.duration = 0.5
        transition.timingFunction = CAMediaTimingFunction(name: kCAMediaTimingFunctionEaseInEaseOut)
        transition.type = kCATransitionFade
        objView.layer.add(transition, forKey: nil)
    })
}

func HideView(objView:UIView){

    UIView.animate(withDuration: 0.5, animations: {
        objView.alpha = 1.0
    }, completion: { (completeFadein: Bool) -> Void in
        objView.alpha = 0.0
        let transition = CATransition()
        transition.duration = 0.5
        transition.timingFunction = CAMediaTimingFunction(name: kCAMediaTimingFunctionEaseInEaseOut)
        transition.type = kCATransitionFade
        objView.layer.add(transition, forKey: nil)
    })
}

এবং আপনার দর্শনের নামটি পাস করুন

        showView(objView: self.viewSaveCard)
        HideView(objView: self.viewSaveCard)

1

যদি আপনার দৃষ্টিভঙ্গিটি ডিফল্টরূপে গোপনে সেট করা থাকে বা আপনি লুকানো রাজ্যটি পরিবর্তন করেন যা আমার মনে হয় আপনার অনেক ক্ষেত্রে হওয়া উচিত, তবে এই পৃষ্ঠার কোনও পন্থা আপনাকে ফ্যাডইন / ফ্যাদআউট অ্যানিমেশন উভয়ই দেবে না, এটি কেবলমাত্র এই রাজ্যের মধ্যে একটিকে অ্যানিমেটেড করবে, কারণটি হ'ল আপনি ইউআইভিউ.অ্যানিম্যাট পদ্ধতিটি কল করার আগে হিডেন স্টেটটি মিথ্যা হিসাবে সেট করছেন যা হঠাৎ দৃশ্যমানতার কারণ হয়ে দাঁড়ায় এবং যদি আপনি কেবল আলফাটি অ্যানিমেটেড করেন তবে অবজেক্টের স্পেসটি এখনও আছে তবে এটি দৃশ্যমান নয় যা কিছু ইউআই সমস্যার কারণে ঘটবে।

সুতরাং সর্বোত্তম পদ্ধতির মধ্যে প্রথমে চেক করা হয় যদি ভিউটি লুকানো থাকে তবে আলফাটি 0.0 তে সেট করুন, আপনি যখন লুকানো অবস্থাকে মিথ্যাতে সেট করেন আপনি হঠাৎ দৃশ্যমানতা দেখতে পাবেন না।

func hideViewWithFade(_ view: UIView) {
    if view.isHidden {
        view.alpha = 0.0
    }

    view.isHidden = false

    UIView.animate(withDuration: 0.3, delay: 0.0, options: .transitionCrossDissolve, animations: {
        view.alpha = view.alpha == 1.0 ? 0.0 : 1.0
    }, completion: { _ in
        view.isHidden = !Bool(truncating: view.alpha as NSNumber)
    })
}

অন্যেরা ফাদিনরা কোথায় কাজ করছে না সে সম্পর্কে জিজ্ঞাসা করা সমস্যাটি সমাধান করে। চতুর পদ্ধতির।
BooTooMany

1

ইউআইভিউ ডট্রান্সিশন (সহ :) ফাংশনটি সুন্দর এবং ঝরঝরে।

অনেকে এটি পোস্ট করেছেন তবে কেউই লক্ষ্য করেন নি যে এটি চালানোর সময়ই কোনও ত্রুটি দেখা দেবে।

আপনি লুকানো সম্পত্তি পুরোপুরি সত্যে স্থানান্তর করতে পারেন, যখন আপনি এটিকে মিথ্যাতে স্থানান্তরিত করার চেষ্টা করেন, দৃশ্যটি কোনও অ্যানিমেশন ছাড়াই হঠাৎ অদৃশ্য হয়ে যায়।

কারণ এপিআই কেবলমাত্র একটি দর্শনের মধ্যে কাজ করে , যার অর্থ আপনি যখন কোনও ভিউ দেখানোর জন্য রূপান্তর করেন, বাস্তবে নিজেই তত্ক্ষণাত্ দেখায় কেবল ধীরে ধীরে এর সামগ্রী অ্যানিমেটেড হয়।

আপনি যখন এই দৃশ্যটি আড়াল করার চেষ্টা করবেন তখন নিজেই ততক্ষণে লুকিয়ে যান, এর সামগ্রীতে অ্যানিমেশনটিকে অর্থহীন করে তোলে।

এটি সমাধানের জন্য, কোনও দৃশ্যটি আড়াল করার সময়, রূপান্তর লক্ষ্যটি আপনি যে আড়াল করতে চান তার পরিবর্তে এর প্যারেন্ট ভিউ হওয়া উচিত।

func transitionView(_ view: UIView?, show: Bool, completion: BoolFunc? = nil) {
    guard let view = view, view.isHidden == show, let parent = view.superview else { return }

    let target: UIView = show ? view : parent
    UIView.transition(with: target, duration: 0.4, options: [.transitionCrossDissolve], animations: {
        view.isHidden = !show
    }, completion: completion)
}

0

সুইফট 3 এর জন্য আমার সমাধান । সুতরাং, আমি ফাংশনটি তৈরি করেছি, যা সঠিক ক্রমে ভিউটি লুকান / লুকিয়ে রাখে (যখন লুকিয়ে থাকে - 0তে আলফা সেট করে তারপরে সত্যে লুকানো হয়; লুকানো হয় না - প্রথমে ভিউটি প্রকাশ করে এবং তারপরে এটি আলফা সেট করে 1):

func hide(_ hide: Bool) {
    let animations = hide ? { self.alpha = 0 } :
                            { self.isHidden = false }
    let completion: (Bool) -> Void = hide ? { _ in self.isHidden = true } :
                                            { _ in UIView.animate(withDuration: duration, animations: { self.alpha = 1 }) }
    UIView.animate(withDuration: duration, animations: animations, completion: completion)
}

মিথ্যা completionহলে ব্লকটিতে কেন অন্য অ্যানিমেশন রয়েছে hide?
জর্জিও

0

সুইফট 4 ট্রানজিশন

    UIView.transition(with: view, duration: 3, options: .transitionCurlDown,
                      animations: {
                        // Animations
                        view.isHidden = hidden
    },
                      completion: { finished in
                        // Compeleted
    })

আপনি যদি পুরানো সুইফ্ট সংস্করণগুলির জন্য পদ্ধতির ব্যবহার করেন তবে আপনি একটি ত্রুটি পাবেন:

Cannot convert value of type '(_) -> ()' to expected argument type '(() -> Void)?'

দরকারী রেফারেন্স


এই অটোলেআউট দিয়ে কাজ করে? অনুরূপ কোড অ্যানিমেটিং নয়। isHiddenমান সঙ্গে সঙ্গে পেশ করা (অর্থাত, অবিলম্বে গোপন / দৃশ্য দেখাচ্ছে)।
ক্র্যাশলোট

0

এই কোডটি ইউএনএভিগেশন কন্ট্রোলারে ভিউকন্ট্রোলারকে পুশ করার মতো অ্যানিমেশন দেয় ...

CATransition *animation = [CATransition animation];
 animation.type = kCATransitionPush;
 animation.subtype = kCATransitionFromRight;
 animation.duration = 0.3;
 [_viewAccountName.layer addAnimation:animation forKey:nil];

 _viewAccountName.hidden = true;

এটি পপ অ্যানিমেশনের জন্য ব্যবহৃত হয়েছে ...

 CATransition *animation = [CATransition animation];
 animation.type = kCATransitionPush;
 animation.subtype = kCATransitionFromLeft;
 animation.duration = 0.3;
 [_viewAccountName.layer addAnimation:animation forKey:nil];

 _viewAccountName.hidden = false;

0

প্রস্থানিত উত্তরের কয়েকটি চেষ্টা করে দেখেছি, কিছু কেবল একটি পরিস্থিতির জন্য কাজ করে, তাদের কারও কারও দু'টি ফাংশন যুক্ত করা প্রয়োজন।

বিকল্প 1

কিছুই করার নেই view.isHidden

extension UIView {
    func animate(fadeIn: Bool, withDuration: TimeInterval = 1.0) {
        UIView.animate(withDuration: withDuration, delay: 0.0, options: .curveEaseInOut, animations: {
            self.alpha = fadeIn ? 1.0 : 0.0
        })
    }
}

তারপরে পাস isFadeIn( trueবা false)

view.animate(fadeIn: isFadeIn) 

বিকল্প 2

কোনও প্যারামিটার পাস করবেন না। এটি অনুযায়ী বা বাইরে বিবর্ণ হয় isUserInteractionEnabled। এটি পরিস্থিতি পিছনে পিছনে খুব ভালভাবে স্যুট করে।

func animateFadeInOut(withDuration: TimeInterval = 1.0) {
    self.isUserInteractionEnabled = !self.isUserInteractionEnabled
    UIView.animate(withDuration: withDuration, delay: 0.0, options: .curveEaseInOut, animations: {
        self.alpha = self.isUserInteractionEnabled ? 1.0 : 0.0
    })
}

তারপর আপনি কল

yourView.animateFadeInOut()

কেন self.isUserInteractionEnabled?

self.isUserInteractionEnabledদ্বারা প্রতিস্থাপন করার চেষ্টা করা self.isHidden, মোটেই ভাগ্য নেই।

এটাই. কিছুটা সময় আমার জন্য ব্যয় করুন, আশা করি এটি কারও সাহায্য করবে।

আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.