मैं एक नया पाठ मान सेट कर रहा हूँ a UILabel
। वर्तमान में, नया पाठ ठीक दिखाई देता है। हालाँकि, मैं नया पाठ प्रकट होने पर कुछ एनीमेशन जोड़ना चाहूंगा। मैं सोच रहा हूँ कि नए पाठ की उपस्थिति को चेतन करने के लिए मैं क्या कर सकता हूँ।
मैं एक नया पाठ मान सेट कर रहा हूँ a UILabel
। वर्तमान में, नया पाठ ठीक दिखाई देता है। हालाँकि, मैं नया पाठ प्रकट होने पर कुछ एनीमेशन जोड़ना चाहूंगा। मैं सोच रहा हूँ कि नए पाठ की उपस्थिति को चेतन करने के लिए मैं क्या कर सकता हूँ।
जवाबों:
मुझे आश्चर्य है कि अगर यह काम करता है, और यह पूरी तरह से काम करता है!
उद्देश्य सी
[UIView transitionWithView:self.label
duration:0.25f
options:UIViewAnimationOptionTransitionCrossDissolve
animations:^{
self.label.text = rand() % 2 ? @"Nice nice!" : @"Well done!";
} completion:nil];
स्विफ्ट 3, 4, 5
UIView.transition(with: label,
duration: 0.25,
options: .transitionCrossDissolve,
animations: { [weak self] in
self?.label.text = (arc4random()() % 2 == 0) ? "One" : "Two"
}, completion: nil)
एक वास्तविक क्रॉस-भंग संक्रमण ( नया लेबल लुप्त होते समय पुराना लेबल लुप्त हो जाना ) प्राप्त करने के लिए, आप अदृश्य को फीका नहीं चाहते। यह अवांछित झिलमिलाहट में परिणाम होगा भले ही पाठ अपरिवर्तित हो ।
इसके बजाय इस दृष्टिकोण का उपयोग करें:
CATransition *animation = [CATransition animation];
animation.timingFunction = [CAMediaTimingFunction functionWithName:kCAMediaTimingFunctionEaseInEaseOut];
animation.type = kCATransitionFade;
animation.duration = 0.75;
[aLabel.layer addAnimation:animation forKey:@"kCATransitionFade"];
// This will fade:
aLabel.text = "New"
इसे भी देखें: दो नंबरों के बीच चेतन उलाबेल पाठ?
IOS 10, 9, 8 में प्रदर्शन:
Xcode 8.2.1 और 7.1 के साथ परीक्षण किया गया , iOS 10 पर 8.0 पर ObjectiveC ।
, पूर्ण परियोजना को डाउनलोड करने के लिए, स्विफ्ट व्यंजनों में SO-3073520 खोजें ।
-addAnimation:forKey
उस लेबल पर एकल लेबल का उपयोग करते हैं , फिर लेबल के पाठ को बदलते हैं।
UILabel को फीका करने का उचित तरीका (या उस मामले के लिए कोई भी UIView) a का उपयोग करना है Core Animation Transition
। यह झिलमिलाहट नहीं करेगा, न ही सामग्री के अपरिवर्तित होने पर यह काला हो जाएगा।
एक पोर्टेबल और स्वच्छ समाधान एक Extension
स्विफ्ट का उपयोग करना है (पूर्व बदलते तत्वों को देखें)
// Usage: insert view.fadeTransition right before changing content
extension UIView {
func fadeTransition(_ duration:CFTimeInterval) {
let animation = CATransition()
animation.timingFunction = CAMediaTimingFunction(name:
CAMediaTimingFunctionName.easeInEaseOut)
animation.type = CATransitionType.fade
animation.duration = duration
layer.add(animation, forKey: CATransitionType.fade.rawValue)
}
}
आमंत्रण इस तरह दिखता है:
// This will fade
aLabel.fadeTransition(0.4)
aLabel.text = "text"
H GitHub पर इस समाधान का पता लगाएं और स्विफ्ट व्यंजनों पर अतिरिक्त विवरण ।
MIT
लाइसेंस आपके कोकोपोड की गारंटी देता है कि इसका उपयोग हर कोई और किसी के द्वारा स्वतंत्र रूप से किया जा सकता है।
iOS4 के बाद से यह स्पष्ट रूप से ब्लॉक के साथ किया जा सकता है:
[UIView animateWithDuration:1.0
animations:^{
label.alpha = 0.0f;
label.text = newText;
label.alpha = 1.0f;
}];
इस कार्य को करने के लिए यहाँ कोड है।
[UIView beginAnimations:@"animateText" context:nil];
[UIView setAnimationCurve:UIViewAnimationCurveEaseIn];
[UIView setAnimationDuration:1.0f];
[self.lbl setAlpha:0];
[self.lbl setText:@"New Text";
[self.lbl setAlpha:1];
[UIView commitAnimations];
UILabel Extension Solution
extension UILabel{
func animation(typing value:String,duration: Double){
let characters = value.map { $0 }
var index = 0
Timer.scheduledTimer(withTimeInterval: duration, repeats: true, block: { [weak self] timer in
if index < value.count {
let char = characters[index]
self?.text! += "\(char)"
index += 1
} else {
timer.invalidate()
}
})
}
func textWithAnimation(text:String,duration:CFTimeInterval){
fadeTransition(duration)
self.text = text
}
//followed from @Chris and @winnie-ru
func fadeTransition(_ duration:CFTimeInterval) {
let animation = CATransition()
animation.timingFunction = CAMediaTimingFunction(name:
CAMediaTimingFunctionName.easeInEaseOut)
animation.type = CATransitionType.fade
animation.duration = duration
layer.add(animation, forKey: CATransitionType.fade.rawValue)
}
}
बस कहा जाता है फ़ंक्शन द्वारा
uiLabel.textWithAnimation(text: "text you want to replace", duration: 0.2)
सभी युक्तियों के लिए धन्यवाद। उम्मीद है कि इससे लंबी अवधि में मदद मिलेगी
SwiftArchitect के उपरोक्त समाधान का स्विफ्ट 4.2 संस्करण (महान काम करता है):
// Usage: insert view.fadeTransition right before changing content
extension UIView {
func fadeTransition(_ duration:CFTimeInterval) {
let animation = CATransition()
animation.timingFunction = CAMediaTimingFunction(name: CAMediaTimingFunctionName.easeInEaseOut)
animation.type = CATransitionType.fade
animation.duration = duration
layer.add(animation, forKey: CATransitionType.fade.rawValue)
}
}
मंगलाचरण:
// This will fade
aLabel.fadeTransition(0.4)
aLabel.text = "text"
स्विफ्ट 2.0:
UIView.transitionWithView(self.view, duration: 1.0, options: UIViewAnimationOptions.TransitionCrossDissolve, animations: {
self.sampleLabel.text = "Animation Fade1"
}, completion: { (finished: Bool) -> () in
self.sampleLabel.text = "Animation Fade - 34"
})
या
UIView.animateWithDuration(0.2, animations: {
self.sampleLabel.alpha = 1
}, completion: {
(value: Bool) in
self.sampleLabel.alpha = 0.2
})
स्विफ्ट 5 के साथ, आप UILabel
कुछ क्रॉस डिसेबल एनीमेशन के साथ अपने पाठ परिवर्तनों को चेतन करने के लिए निम्नलिखित दो प्लेग्राउंड कोड नमूनों में से एक चुन सकते हैं ।
UIView
's transition(with:duration:options:animations:completion:)
वर्ग विधिimport UIKit
import PlaygroundSupport
class ViewController: UIViewController {
let label = UILabel()
override func viewDidLoad() {
super.viewDidLoad()
label.text = "Car"
view.backgroundColor = .white
view.addSubview(label)
label.translatesAutoresizingMaskIntoConstraints = false
label.centerXAnchor.constraint(equalTo: view.centerXAnchor).isActive = true
label.centerYAnchor.constraint(equalTo: view.centerYAnchor).isActive = true
let tapGesture = UITapGestureRecognizer(target: self, action: #selector(toggle(_:)))
view.addGestureRecognizer(tapGesture)
}
@objc func toggle(_ sender: UITapGestureRecognizer) {
let animation = {
self.label.text = self.label.text == "Car" ? "Plane" : "Car"
}
UIView.transition(with: label, duration: 2, options: .transitionCrossDissolve, animations: animation, completion: nil)
}
}
let controller = ViewController()
PlaygroundPage.current.liveView = controller
CATransition
और CALayer
की add(_:forKey:)
विधिimport UIKit
import PlaygroundSupport
class ViewController: UIViewController {
let label = UILabel()
let animation = CATransition()
override func viewDidLoad() {
super.viewDidLoad()
label.text = "Car"
animation.timingFunction = CAMediaTimingFunction(name: CAMediaTimingFunctionName.easeInEaseOut)
// animation.type = CATransitionType.fade // default is fade
animation.duration = 2
view.backgroundColor = .white
view.addSubview(label)
label.translatesAutoresizingMaskIntoConstraints = false
label.centerXAnchor.constraint(equalTo: view.centerXAnchor).isActive = true
label.centerYAnchor.constraint(equalTo: view.centerYAnchor).isActive = true
let tapGesture = UITapGestureRecognizer(target: self, action: #selector(toggle(_:)))
view.addGestureRecognizer(tapGesture)
}
@objc func toggle(_ sender: UITapGestureRecognizer) {
label.layer.add(animation, forKey: nil) // The special key kCATransition is automatically used for transition animations
label.text = label.text == "Car" ? "Plane" : "Car"
}
}
let controller = ViewController()
PlaygroundPage.current.liveView = controller
४.२ समाधान (४.० उत्तर लेना और संकलन के लिए नई पहेली के लिए अद्यतन करना)
extension UIView {
func fadeTransition(_ duration:CFTimeInterval) {
let animation = CATransition()
animation.timingFunction = CAMediaTimingFunction(name:
CAMediaTimingFunctionName.easeInEaseOut)
animation.type = CATransitionType.fade
animation.duration = duration
layer.add(animation, forKey: CATransitionType.fade.rawValue)
}
}
func updateLabel() {
myLabel.fadeTransition(0.4)
myLabel.text = "Hello World"
}
सिस्टम डिफ़ॉल्ट मान 0.25 के लिए duration
और .curveEaseInEaseOut के लिए timingFunction
अक्सर एनिमेशन में स्थिरता के लिए बेहतर हैं, और छोड़ा जा सकता है:
let animation = CATransition()
label.layer.add(animation, forKey: nil)
label.text = "New text"
जो इसे लिखने के समान है:
let animation = CATransition()
animation.duration = 0.25
animation.timingFunction = .curveEaseInEaseOut
label.layer.add(animation, forKey: nil)
label.text = "New text"
यह एक C # UIView विस्तार विधि है जो @ SwiftArchitect के कोड पर आधारित है। जब ऑटो लेआउट शामिल होता है और लेबल के पाठ के आधार पर नियंत्रण को स्थानांतरित करने की आवश्यकता होती है, तो यह कॉलिंग कोड लेबल के सुपरविवे का उपयोग लेबल के बजाय संक्रमण दृश्य के रूप में करता है। मैंने इसे और अधिक संक्षिप्त बनाने के लिए कार्रवाई के लिए एक लंबोतरा अभिव्यक्ति जोड़ी।
public static void FadeTransition( this UIView AView, double ADuration, Action AAction )
{
CATransition transition = new CATransition();
transition.Duration = ADuration;
transition.TimingFunction = CAMediaTimingFunction.FromName( CAMediaTimingFunction.Linear );
transition.Type = CATransition.TransitionFade;
AView.Layer.AddAnimation( transition, transition.Type );
AAction();
}
कॉलिंग कोड:
labelSuperview.FadeTransition( 0.5d, () =>
{
if ( condition )
label.Text = "Value 1";
else
label.Text = "Value 2";
} );
यदि आप Swift
एक देरी के साथ ऐसा करने की कोशिश करेंगे:
delay(1.0) {
UIView.transitionWithView(self.introLabel, duration: 0.25, options: [.TransitionCrossDissolve], animations: {
self.yourLabel.text = "2"
}, completion: { finished in
self.delay(1.0) {
UIView.transitionWithView(self.introLabel, duration: 0.25, options: [.TransitionCrossDissolve], animations: {
self.yourLabel.text = "1"
}, completion: { finished in
})
}
})
}
@matt - https://stackoverflow.com/a/24318861/1982051 द्वारा निर्मित निम्नलिखित फ़ंक्शन का उपयोग करना :
func delay(delay:Double, closure:()->()) {
dispatch_after(
dispatch_time(
DISPATCH_TIME_NOW,
Int64(delay * Double(NSEC_PER_SEC))
),
dispatch_get_main_queue(), closure)
}
जो स्विफ्ट 3 में यह बन जाएगा
func delay(_ delay:Double, closure:()->()) {
let when = DispatchTime.now() + delay
DispatchQueue.main.after(when: when, execute: closure)
}
इसे प्राप्त करने के लिए एक और उपाय है। यह यहाँ वर्णित किया गया था । यह विचार निम्न प्रकार से फ़ंक्शन को उपवर्गित UILabel
और अधिलेखित action(for:forKey:)
कर रहा है:
class LabelWithAnimatedText: UILabel {
override var text: String? {
didSet {
self.layer.setValue(self.text, forKey: "text")
}
}
override func action(for layer: CALayer, forKey event: String) -> CAAction? {
if event == "text" {
if let action = self.action(for: layer, forKey: "backgroundColor") as? CAAnimation {
let transition = CATransition()
transition.type = kCATransitionFade
//CAMediatiming attributes
transition.beginTime = action.beginTime
transition.duration = action.duration
transition.speed = action.speed
transition.timeOffset = action.timeOffset
transition.repeatCount = action.repeatCount
transition.repeatDuration = action.repeatDuration
transition.autoreverses = action.autoreverses
transition.fillMode = action.fillMode
//CAAnimation attributes
transition.timingFunction = action.timingFunction
transition.delegate = action.delegate
return transition
}
}
return super.action(for: layer, forKey: event)
}
}
उपयोग के उदाहरण:
// do not forget to set the "Custom Class" IB-property to "LabelWithAnimatedText"
// @IBOutlet weak var myLabel: LabelWithAnimatedText!
// ...
UIView.animate(withDuration: 0.5) {
myLabel.text = "I am animated!"
}
myLabel.text = "I am not animated!"