উত্তর:
আইওএস 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;
এই পদ্ধতির দুর্দান্ত জিনিস হ'ল আপনি বোতামের যে কোনও সম্পত্তি অ্যানিমেটেবল (যেমন বোতামের পাঠ্য বা চিত্র) না থাকলেও ক্রসফেইড করতে পারেন, কেবলমাত্র স্থানান্তর সেট আপ করুন এবং তারপরে তত্ক্ষণাত আপনার বৈশিষ্ট্যগুলি সেট করুন।
transitionWithView
প্যারামিটার হিসাবে অ্যানিমেট করছেন সেটির সুপারভিউটি আপনার সফল ফিড ইন এবং আউট নিশ্চিত করতে হবে।
ইউআইভিউ অ্যানিমেটেড বৈশিষ্ট্যগুলি হ'ল:
- 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];
}
বিবর্ণ হওয়া:
উদ্দেশ্য গ
[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
}
আমি এই ছোট্ট সুইফট 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)
}
}
দ্রুত 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
})
}
মসৃণ ফিডআউট এবং ফেডইন ইফেক্টগুলির জন্য এই সমাধানটি ব্যবহার করুন
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
।
আমি বিভাগ নির্মিত 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 এ সুইফটে সূক্ষ্মভাবে কাজ করছে
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
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
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
})
অ্যানিম্যাটিক্স লাইব্রেরি ব্যবহার করে আপনি এটি খুব সহজেই করতে পারেন :
//To hide button:
AlphaAnimator(0) ~> button
//to show button
AlphaAnimator(1) ~> button
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
})
}
আপনি এটি চেষ্টা করতে পারেন।
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)
যদি আপনার দৃষ্টিভঙ্গিটি ডিফল্টরূপে গোপনে সেট করা থাকে বা আপনি লুকানো রাজ্যটি পরিবর্তন করেন যা আমার মনে হয় আপনার অনেক ক্ষেত্রে হওয়া উচিত, তবে এই পৃষ্ঠার কোনও পন্থা আপনাকে ফ্যাডইন / ফ্যাদআউট অ্যানিমেশন উভয়ই দেবে না, এটি কেবলমাত্র এই রাজ্যের মধ্যে একটিকে অ্যানিমেটেড করবে, কারণটি হ'ল আপনি ইউআইভিউ.অ্যানিম্যাট পদ্ধতিটি কল করার আগে হিডেন স্টেটটি মিথ্যা হিসাবে সেট করছেন যা হঠাৎ দৃশ্যমানতার কারণ হয়ে দাঁড়ায় এবং যদি আপনি কেবল আলফাটি অ্যানিমেটেড করেন তবে অবজেক্টের স্পেসটি এখনও আছে তবে এটি দৃশ্যমান নয় যা কিছু ইউআই সমস্যার কারণে ঘটবে।
সুতরাং সর্বোত্তম পদ্ধতির মধ্যে প্রথমে চেক করা হয় যদি ভিউটি লুকানো থাকে তবে আলফাটি 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)
})
}
ইউআইভিউ ডট্রান্সিশন (সহ :) ফাংশনটি সুন্দর এবং ঝরঝরে।
অনেকে এটি পোস্ট করেছেন তবে কেউই লক্ষ্য করেন নি যে এটি চালানোর সময়ই কোনও ত্রুটি দেখা দেবে।
আপনি লুকানো সম্পত্তি পুরোপুরি সত্যে স্থানান্তর করতে পারেন, যখন আপনি এটিকে মিথ্যাতে স্থানান্তরিত করার চেষ্টা করেন, দৃশ্যটি কোনও অ্যানিমেশন ছাড়াই হঠাৎ অদৃশ্য হয়ে যায়।
কারণ এপিআই কেবলমাত্র একটি দর্শনের মধ্যে কাজ করে , যার অর্থ আপনি যখন কোনও ভিউ দেখানোর জন্য রূপান্তর করেন, বাস্তবে নিজেই তত্ক্ষণাত্ দেখায় কেবল ধীরে ধীরে এর সামগ্রী অ্যানিমেটেড হয়।
আপনি যখন এই দৃশ্যটি আড়াল করার চেষ্টা করবেন তখন নিজেই ততক্ষণে লুকিয়ে যান, এর সামগ্রীতে অ্যানিমেশনটিকে অর্থহীন করে তোলে।
এটি সমাধানের জন্য, কোনও দৃশ্যটি আড়াল করার সময়, রূপান্তর লক্ষ্যটি আপনি যে আড়াল করতে চান তার পরিবর্তে এর প্যারেন্ট ভিউ হওয়া উচিত।
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)
}
সুইফট 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
?
সুইফট 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
মান সঙ্গে সঙ্গে পেশ করা (অর্থাত, অবিলম্বে গোপন / দৃশ্য দেখাচ্ছে)।
এই কোডটি ইউএনএভিগেশন কন্ট্রোলারে ভিউকন্ট্রোলারকে পুশ করার মতো অ্যানিমেশন দেয় ...
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;
প্রস্থানিত উত্তরের কয়েকটি চেষ্টা করে দেখেছি, কিছু কেবল একটি পরিস্থিতির জন্য কাজ করে, তাদের কারও কারও দু'টি ফাংশন যুক্ত করা প্রয়োজন।
বিকল্প 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
, মোটেই ভাগ্য নেই।
এটাই. কিছুটা সময় আমার জন্য ব্যয় করুন, আশা করি এটি কারও সাহায্য করবে।