2013-10-08 3 views
9

मैं आईओएस 7 का उपयोग कर रहा हूं और मैं अपने विचार के बाईं ओर स्थित एक लेबल को स्थानांतरित करने की कोशिश कर रहा हूं। वर्तमान में मैं यह बदलकर ऐसा करने की कोशिश कर रहा हूं कि मेरा यूलाबेल कैसे गठबंधन किया गया है, और मैं इस प्रक्रिया में इसे एनिमेट करने की कोशिश कर रहा हूं। मैं वर्तमान में निम्नलिखित को बुला रहा हूं:क्या UILabel के टेक्स्ट को बदलने का एनीमेट करने का कोई तरीका है?

[UIView animateWithDuration:0.5 
       animations:^{ 
         self.monthLabel.textAlignment = NSTextAlignmentLeft; 
       } completion:nil]; 

लेकिन यह लेबल को नए संरेखण में कूदता है। क्या इसे एनिमेट करने का कोई तरीका है, या ऐसा करने के लिए लेबल को समायोजित करने का एक बेहतर तरीका है?

उत्तर

9

यूआईएलएबल फ्रेम आकार को सटीक रूप से टेक्स्ट में रखने और आपके दृश्य में UILabel को केंद्र में सेट करने के लिए सेट करें।

self.monthLabel.text = @"February"; 
[self.monthLabel sizeToFit]; 
self.monthLabel.center = parentView.center; // You may need to adjust the y position 

फिर संरेखण सेट करें जो लेआउट को प्रभावित नहीं करेगा क्योंकि कोई अतिरिक्त स्थान नहीं होगा।

self.monthLabel.textAlignment = NSTextAlignmentLeft; 

अगला, UILabel फ्रेम आकार को एनिमेट करें ताकि यह उस स्थान पर स्लाइड हो जहां आप इसे चाहते हैं।

[UIView animateWithDuration:0.5 
      animations:^{ 
        CGRect frame = self.monthLabel.frame; 
        frame.origin.x = 10; 
        self.monthLabel.frame = frame; 
      } completion:nil]; 
+0

मैं अपने लेबल के सटीक आकार में अपना फ्रेम सेट करने में सक्षम नहीं हूं, क्योंकि टेक्स्ट बदल जाएगा, विशेष रूप से विभिन्न महीनों के नाम के साथ – lehn0058

+0

टेक्स्ट लेबल सेट करते समय अपने लेबल फ्रेम को अपडेट करें। मैंने यह दिखाने के लिए जवाब अपडेट किया कि यह कैसे करें। – bbarnhart

+0

@bbarnhart क्या होगा अगर लेबल में टेक्स्ट की 2 पंक्तियां हों? यह काम नहीं कर रहा है ... –

1

आप फ्रेम को एनिमेट कर सकते हैं, पाठ नहीं।

एक [UILabel sizeToFit] क्या आप फ्रेम पर किसी भी "पैडिंग" से छुटकारा पाने के लिए करना चाहते हैं क्या आपके लेबल पर है, तो आप इसे चारों ओर ले जाने आप इच्छा के रूप में अपने एनीमेशन ब्लॉक में फ्रेम चेतन कर सकते हैं

CGRect frameLabel = self.monthLabel.frame; 

[UIView animateWithDuration:0.5 
       animations:^{ 
         frameLabel.origin.x -= 100;   // e.g. move it left by 100 
         self.monthLabel.frame = frameLabel; 
       } completion:nil]; 
+0

मैं इस दृष्टिकोण पसंद करने के लिए सक्षम होना चाहिए! मुझे अपना लेबल केंद्रित करने की आवश्यकता है (अभी यह कैलेंडर संग्रह दृश्य के ऊपर एक महीने का नाम दिखा रहा है) इसलिए मैं इसके साथ खेलूँगा और शुरुआत में टेक्स्ट का उपयोग करने की कोशिश करने के बजाय लेबल का केंद्र सेट कर दूंगा – lehn0058

+0

यदि आप चाहते हैं ब्लॉक एनीमेशन में वैरिएबल "फ्रेम लेबल" सेट करें, आपको एक्सेस उपसर्ग "__block CGRect फ्रेम लेबल" के साथ सेट वैरिएबल की आवश्यकता है ..., क्योंकि आप ब्लॉक में वैल्यू वेरिएबल फ्रेम लेबल बदल देंगे। – horkavlna

0

आपको बस अपने लेबल फ्रेम को एनिमेट करने की आवश्यकता है। यहां के रूप में समापन ब्लॉक है इसमें आपको फ्रेम को फिर से बदलना चाहिए। और लूप जा रहा है।

[UIView animateWithDuration:0.5 
       animations:^{ 
         // Change the frame 
       } completion:^{[UIView animateWithDuration:0.5 
       animations:^{ 
         // Change the frame 
       } completion:^{ 
        // repeat the proccess 
}] 

}]; 
+0

मैं चाहता हूं, लेकिन मेरे पास लेबल के दोनों तरफ पैडिंग है क्योंकि मेरा टेक्स्ट उपयोगकर्ता द्वारा चुने गए महीने के आधार पर बदल जाएगा। – lehn0058

2

क्या आपका लेबल मल्टीलाइन है? इस तरह एक एनीमेशन: http://img62.imageshack.us/img62/9693/t7hx.png?

यदि ऐसा है, तो कुछ विकल्प हैं।

बहुपंक्ति लेबल

विकल्प 1:

एक पारंपरिक UIView एनीमेशन के बजाय

, एक UIView संक्रमण का प्रयास करें। पाठ बाईं ओर स्लाइड नहीं होगा, बल्कि इसके बजाय यह नई स्थिति में अच्छी तरह से फीका होगा।

[UIView transitionWithView:self.monthLabel 
         duration:0.5 
         options:UIViewAnimationOptionTransitionCrossDissolve 
        animations:^{ 
     self.monthLabel.textAlignment = NSTextAlignmentLeft; 
    } completion:NO]; 

विकल्प 2:

आप मैन्युअल रूप से काम कर सकते हैं जहां नई लाइनें दिखाई देगा, तो पाठ की प्रत्येक पंक्ति तो फ्रेम चेतन के लिए एक अलग UILabel पैदा करते हैं। यह स्पष्ट रूप से अधिक काम है, लेकिन वांछित स्लाइड एनीमेशन दे देंगे।

सिंगल लाइन लेबल

इसके बजाय textAlignment एनिमेट की, लेबल स्ट्रिंग के एक ही आकार यह [self.monthLabel sizeToFit] साथ शामिल करते हैं, तो मैन्युअल रूप से बाहर तैयार करने और केंद्रित काम करते हैं। फिर फ्रेम को एनिमेट करें, मल्टीलाइन लेबल पर विकल्प 2 के समान।

0

यह मैं अच्छी तरह से सेवा की है

import Foundation 
import UIKit 


class AnimatableMultilineLabel: UIView { 

    enum Alignment { 
     case left 
     case right 
    } 

    public var textAlignment: Alignment = .left { 
     didSet { 
      layout() 
     } 
    } 

    public var font: UIFont? = nil { 
     didSet { 
      setNeedsLayout() 
     } 
    } 

    public var textColor: UIColor? = nil { 
     didSet { 
      setNeedsLayout() 
     } 
    } 

    public var lines: [String] = [] { 
     didSet { 
      for label in labels { 
       label.removeFromSuperview() 
      } 
      labels = [] 
      setNeedsLayout() 
     } 
    } 

    private var labels: [UILabel] = [] 

    override init(frame: CGRect) { 
     super.init(frame: frame) 
     setup() 
    } 

    required init?(coder aDecoder: NSCoder) { 
     super.init(coder: aDecoder) 
     setup() 
    } 

    private func setup() { 
     isUserInteractionEnabled = false 
    } 

    override func layoutSubviews() { 
     super.layoutSubviews() 

     layout() 
    } 

    private func layout() { 

     autocreateLabels() 

     var yPosition: CGFloat = 0.0 
     for label in labels { 
      let size = label.sizeThatFits(bounds.size) 
      let minX = textAlignment == .left ? 0.0 : bounds.width - size.width 
      let frame = CGRect(x: minX, y: yPosition, width: size.width, height: size.height) 
      label.frame = frame 
      yPosition = frame.maxY 
     } 
    } 

    private func autocreateLabels() { 
     if labels.count != lines.count { 
      for text in lines { 
       let label = UILabel() 
       label.font = font 
       label.textColor = textColor 
       label.text = text 
       addSubview(label) 
       labels.append(label) 
      } 
     } 
    } 

    override func sizeThatFits(_ size: CGSize) -> CGSize { 
     autocreateLabels() 

     var height: CGFloat = 0.0 
     for label in labels { 
      height = label.sizeThatFits(size).height 
     } 
     return CGSize(width: size.width, height: height) 
    } 
} 

तो फिर तुम

UIView.animate(withDuration: 0.5, animations: { 
    multilineLabel.textAlignment = .right 
}) 
+0

दिलचस्प। आप कैसे तय करते हैं कि कौन सी लाइनें टूट जाएंगी? – agibson007

+0

सभी लाइनें तोड़ रही थीं इसलिए मुझे पता था कि मैं इसे इस तरह घोषित कर सकता हूं। एक बेहतर समाधान एक जिम्मेदार स्ट्रिंग लेगा और लाइन ब्रेक स्वचालित रूप से एनिमेट करेगा। – hfossli

संबंधित मुद्दे

 संबंधित मुद्दे