যেহেতু গুগলে এটি শীর্ষ ফলাফল, আমি ভেবেছিলাম যে আমি যা বোধ করি তা সবচেয়ে বুদ্ধিমান উপায়; যা হ'ল আইওএস 7+ রূপান্তরকারী এপিআই ব্যবহার করা। আমি সুইফট 3 সহ আইওএস 10 এর জন্য এটি প্রয়োগ করেছি।
প্রোটোকলের সাথে সামঞ্জস্যপূর্ণ এমন কোনও শ্রেণীর একটি উপস্থাপনা UINavigationController
তৈরি করে যদি আপনি একটি সাবক্লাস তৈরি করেন UINavigationController
এবং দু'টি ভিউ কন্ট্রোলারের মধ্যে কীভাবে অ্যানিমেট করে তার সাথে এটি একত্রিত করা খুব সহজ UIViewControllerAnimatedTransitioning
।
উদাহরণস্বরূপ এখানে আমার UINavigationController
সাবক্লাসটি রয়েছে:
class NavigationController: UINavigationController {
init() {
super.init(nibName: nil, bundle: nil)
delegate = self
}
required init?(coder aDecoder: NSCoder) {
fatalError("init(coder:) has not been implemented")
}
}
extension NavigationController: UINavigationControllerDelegate {
public func navigationController(_ navigationController: UINavigationController, animationControllerFor operation: UINavigationControllerOperation, from fromVC: UIViewController, to toVC: UIViewController) -> UIViewControllerAnimatedTransitioning? {
return NavigationControllerAnimation(operation: operation)
}
}
আপনি দেখতে পাচ্ছেন যে আমি UINavigationControllerDelegate
নিজেই এটি সেট করে রেখেছি এবং আমার সাবক্লাসে একটি এক্সটেনশনে আমি সেই পদ্ধতিটি প্রয়োগ করি UINavigationControllerDelegate
যা আপনাকে একটি কাস্টম অ্যানিমেশন নিয়ন্ত্রণকারী (যেমন, NavigationControllerAnimation
) ফেরত দিতে দেয় । এই কাস্টম অ্যানিমেশন নিয়ামক আপনার জন্য স্টক অ্যানিমেশন প্রতিস্থাপন করবে।
আপনি সম্ভবত ভাবছেন যে আমি কেন NavigationControllerAnimation
এটির আরম্ভকারীটির মাধ্যমে অপারেশনটিতে উদাহরণটিতে পৌঁছে দেব । আমি এটি এমনটি করি যাতে প্রোটোকলের NavigationControllerAnimation
প্রয়োগে UIViewControllerAnimatedTransitioning
আমি জানি যে অপারেশনটি কী (যেমন, 'পুশ' বা 'পপ')। এটি আমার কী ধরণের অ্যানিমেশন করা উচিত তা জানতে সহায়তা করে। বেশিরভাগ সময়, আপনি অপারেশনের উপর নির্ভর করে একটি আলাদা অ্যানিমেশন সম্পাদন করতে চান।
বাকিটা বেশ মানসম্পন্ন। UIViewControllerAnimatedTransitioning
প্রোটোকলে দুটি প্রয়োজনীয় ফাংশন বাস্তবায়ন করুন এবং আপনার পছন্দ মতো অ্যানিমেট করুন:
class NavigationControllerAnimation: NSObject, UIViewControllerAnimatedTransitioning {
let operation: UINavigationControllerOperation
init(operation: UINavigationControllerOperation) {
self.operation = operation
super.init()
}
func transitionDuration(using transitionContext: UIViewControllerContextTransitioning?) -> TimeInterval {
return 0.3
}
public func animateTransition(using transitionContext: UIViewControllerContextTransitioning) {
guard let fromViewController = transitionContext.viewController(forKey: UITransitionContextViewControllerKey.from),
let toViewController = transitionContext.viewController(forKey: UITransitionContextViewControllerKey.to) else { return }
let containerView = transitionContext.containerView
if operation == .push {
// do your animation for push
} else if operation == .pop {
// do your animation for pop
}
}
}
এটি মনে রাখা গুরুত্বপূর্ণ, যে প্রতিটি পৃথক প্রকারের ক্রিয়াকলাপের জন্য (যেমন, 'পুশ' বা 'পপ), এবং নিয়ন্ত্রকগুলির দৃষ্টিগোচর আলাদা হবে। আপনি যখন একটি পুশ অপারেশনে থাকবেন, তখন দেখার নিয়ামকটি সেই ধাক্কা দেওয়া হবে। আপনি যখন কোনও পপ অপারেশনে থাকবেন তখন দেখার জন্য নিয়ামকটি সেইটিতে স্থানান্তরিত হবে এবং ভিউ কন্ট্রোলারটি পপ করা হচ্ছে।
এছাড়াও, রূপান্তর প্রসঙ্গে to
ভিউ কন্ট্রোলারের অবশ্যই একটি সংক্ষিপ্তসার হিসাবে যুক্ত করা উচিত containerView
।
যখন আপনার অ্যানিমেশনটি সম্পূর্ণ হবে, আপনাকে অবশ্যই কল করতে হবে transitionContext.completeTransition(true)
। আপনি একটি ইন্টারেক্টিভ রূপান্তরটি করছেন হয়, আপনি পরিবর্তনশীল একটি ফিরতি করতে হবে Bool
করতে completeTransition(didComplete: Bool)
রূপান্তরটি অ্যানিমেশন শেষে সম্পূর্ণ হলে তার উপর নির্ভর করে।
শেষ অবধি ( readingচ্ছিক পড়া ), আপনি দেখতে চান যে আমি যে রূপান্তরটি নিয়ে কাজ করছি তা কীভাবে করেছি। এই কোডটি কিছুটা বেশি হ্যাকি এবং আমি এটি খুব তাড়াতাড়ি লিখেছি যাতে আমি এটি দুর্দান্ত অ্যানিমেশন কোড না বলি তবে এটি এখনও অ্যানিমেশন অংশটি কীভাবে করতে হয় তা দেখায়।
আমার একটি সত্যই সরল স্থানান্তর ছিল; আমি ইউআইএনএভিগেশন কন্ট্রোলার সাধারণত একই অ্যানিমেশনটি নকল করতে চেয়েছিলাম, তবে এটি 'শীর্ষ পৃষ্ঠার উপরের পৃষ্ঠা' অ্যানিমেশনটির পরিবর্তে আমি পুরানো ভিউ নিয়ামকের একটি 1: 1 অ্যানিমেশনটি নতুন দর্শন হিসাবে একই সময়ে বাস্তবায়ন করতে চেয়েছিলাম নিয়ামক উপস্থিত হয়। এটি দুটি ভিউ নিয়ন্ত্রককে একে অপরের সাথে পিন করা মনে হয় এমন করে তোলে।
পুশ অপারেশনের জন্য, প্রথমে toViewController
x – অক্ষ থেকে স্ক্রিনের দর্শন উত্সটি সেট করা দরকার containerView
, এটিকে origin.x
শূন্যে সেট করে স্ক্রিনে এনিমেট করে , এর উপদর্শন হিসাবে যুক্ত করা উচিত । একই সময়ে, আমি স্ক্রিনটি বন্ধ করে fromViewController
দিয়ে এর দৃশ্য দূরে সঞ্চারিত করছি origin.x
:
toViewController.view.frame = containerView.bounds.offsetBy(dx: containerView.frame.size.width, dy: 0.0)
containerView.addSubview(toViewController.view)
UIView.animate(withDuration: transitionDuration(using: transitionContext),
delay: 0,
options: [ UIViewAnimationOptions.curveEaseOut ],
animations: {
toViewController.view.frame = containerView.bounds
fromViewController.view.frame = containerView.bounds.offsetBy(dx: -containerView.frame.size.width, dy: 0)
},
completion: { (finished) in
transitionContext.completeTransition(true)
})
পপ অপারেশনটি মূলত বিপরীত। যোগ toViewController
একটি subview যেমন containerView
, এবং দূরে সজীব fromViewController
ডানদিকে যেমন আপনি সজীব toViewController
বাঁ দিক থেকে:
containerView.addSubview(toViewController.view)
UIView.animate(withDuration: transitionDuration(using: transitionContext),
delay: 0,
options: [ UIViewAnimationOptions.curveEaseOut ],
animations: {
fromViewController.view.frame = containerView.bounds.offsetBy(dx: containerView.frame.width, dy: 0)
toViewController.view.frame = containerView.bounds
},
completion: { (finished) in
transitionContext.completeTransition(true)
})
পুরো সুইফ্ট ফাইলটি সহ এখানে একটি সংক্ষেপ:
https://gist.github.com/alanzeino/603293f9da5cd0b7f6b60dc20bc766be