2013-06-10 6 views
10

मुझे एक बहुत ही सरल कार्य पर एक अजीब समस्या है। -> एक UILabel और एक साधारण UIViewऑटोलाउट और यूलाबेल आकार बदलें एनीमेशन डिवाइस रोटेशन पर ठीक से काम नहीं कर रहा है

|--------------------------------------| 
|    Parent View    | 
|          | 
||------------------------------------|| 
||    UILabel    || 
||------------------------------------|| 
|          | 
|          | 
||------------------------------------|| 
||    UIView    || 
||------------------------------------|| 
|          | 
|          | 
|--------------------------------------| 

उदाहरण में ऊपर हम 2 subviews के साथ एक माता पिता के दृश्य दिखाई देते हैं:

मैं इस समस्या पुन: पेश करने के लिए एक बहुत छोटे सेटअप की जरूरत है। autolayout का उपयोग कर इम लागू करने के लिए लेआउट ऊपर दिखाए:

Constraints for UILabel: 
Leading Space to superview = 0 
Trailing Space to superview = 0 
Fixed Height constraint (e.g. 80pt) 
Top Space constraint (e.g. 50pt) 

The UIView subview has the same constraint types (the values for height and top space differs). 

तो क्या मैं इस सेटअप के साथ उम्मीद है कि दोनों subviews अपनी मूल की पूरी चौड़ाई के रूप में हम परिभाषित है कि प्रमुख और अंतरिक्ष अनुगामी शून्य होना चाहिए अपनाने जाएगा। इसलिए यदि मूल दृश्य की चौड़ाई बदलती है, तो गठबंधन रहने के लिए, सबव्यूव की चौड़ाई भी बदलनी चाहिए।

कहता है कि मूल दृश्य में 200x400 pt का आयाम है। जब मैं चित्र में अपना उदाहरण बना और चलाता हूं तो सब कुछ ठीक दिखता है। जब मैं परिदृश्य में घुमाता हूं, तब भी सब ठीक दिखता है। माता-पिता के विचार चौड़ाई और यहां तक ​​कि सबव्यू चौड़ाई भी बड़ी हो गई। लेकिन अब जब मैं वापस चित्र को UILabels चौड़ाई बारी बारी से तुरंत किसी भी एनीमेशन के बिना अपने लक्ष्य चौड़ाई हो जाता है:

|--------------------------------------| 
|    Parent View    | 
|          | 
| (immediately has target size)  | 
|   |--------------|   | 
|   | UILabel |   | 
|   |--------------|   | 
|          | 
| (this subview is still    | 
|    animating its width)  | 
| |------------------------------| | 
|-->|   UIView    |<--| 
| |------------------------------| | 
|          | 
|          | 
|--------------------------------------| 

माता पिता विचारों चौड़ाई और UIView subviews चौड़ाई ठीक से एनिमेटेड रहे हैं। इसका एकमात्र यूलाबेल है जिसमें यहां एक अजीब व्यवहार है और मैं यह नहीं समझ सकता कि उस मुद्दे का क्या कारण है।

+0

क्या आप पदानुक्रम और बाधाओं को प्रोग्रामेटिक रूप से बना रहे हैं? उस स्थिति में, क्या आपने अनुवाद करने के लिए AutoresizingMaskIntoConstraints को सेट किया है? –

+0

क्या आपने इसे समझ लिया? मुझे भी यही समस्या हो रही है – user18853

उत्तर

0

समस्या यह नहीं है कि UILabel अपने आकार को एनिमेट नहीं कर रहा है लेकिन पाठ एनिमेट नहीं करता है। यदि आप लेबल को एक अलग पृष्ठभूमि रंग देना चाहते थे, तो आप पाएंगे कि यह वास्तव में एनिमेट करता है, और यह केवल वह पाठ है जो स्थिति में कूदता है।

इसे ठीक करने का एक तरीका लेबल के चौड़ाई को बिना एनीमेशन के बदलना होगा और एक्स पॉइंट्स द्वारा ओबर को ले जाना होगा, जहां एक्स प्रारंभिक और समाप्ति चौड़ाई के बीच अंतर का आधा है, और उसके बाद बस इसकी स्थिति को एनिमेट करें।

आपके कोड के लिए इस विधि के साथ एकमात्र समस्या यह है कि मुझे विश्वास नहीं है कि आप ऑटो लेआउट के साथ ऐसा करने में सक्षम होंगे।

0

जैसा कि मुझे याद है, बाधाओं के लिए आपको कुछ और चश्मा प्रदान करना चाहिए, लेकिन ऐसे आसान यूआई तत्वों के लिए मैं UIViewAutoresizing मास्क का उपयोग करने का सुझाव दूंगा। वे बहुत सरल हैं और छोटी परिभाषाएं हैं। आपके मामले में बस UIViewAutoresizingFlexibleWidth का उपयोग करें।

0

story board में सेट करना बेहतर है। कृपया सुनिश्चित करें कि जब आप बाधाओं को सेट कर रहे हैं तो आप अपने दृश्य नियंत्रक में सभी उप दृश्यों का चयन कर रहे हैं। उसके लिए आपको निम्न करना चाहिए: अपने मुख्य दृश्य नियंत्रक के दृश्य पर

  1. क्लिक करें
  2. प्रेस Ctrl+A
  3. क्लिक करें हल स्वत: लेआउट मुद्दे
  4. का चयन आपके दृश्य नियंत्रक में लापता की कमी जोड़े

तब बाधा सभी सबव्यू में सेट की जाएगी और घूर्णन के दौरान पूरी तरह से काम करेगी।

1

मेरे सुझाव हैं:

आप subclassed गया है माता पिता दृश्य का उपयोग - (void)layoutSubviews:

- (void)layoutSubviews { 
    label.frame = CGRectMake(leftInset, labelY, parentView.frame.size.width - leftInset*2, labelHeight); 
    childView.frame = CGRectMake(leftInset, childViewY, parentView.frame.size.width - leftInset*2, childHeight); 
} 

अगर आप जनक दृश्य subclassed नहीं था आप उपयोग कर सकते autoresizingMask:

label.autoresizingMask = UIViewAutoresizingFlexibleWidth; 
childView.autoresizingMask = UIViewAutoresizingFlexibleWidth; 
संबंधित मुद्दे