5

यदि मैं अपने विचारों में UIDynamicBehavior किसी भी प्रकार का जोड़ता हूं, तो डिवाइस घुमाए जाने पर यह पूरी तरह से चीजों को तोड़ देता है। यहां बताया गया है कि यह चित्र (सही ढंग से प्रदर्शित) में है:यूआईडीएनेमिक्स और डिवाइस रोटेशन

Correct Layout

और यहाँ यह परिदृश्य में है, सब को तोड़ दिया: Broken layout

मैं क्योंकि अगर मैंने कॉल निकालने यह एक autolayout मुद्दा है पर विश्वास नहीं करते UIDynamicBehavior जोड़ने के लिए यह कोई autolayout समस्याओं के साथ ठीक काम करता है। कोई autolayout त्रुटियों को कभी भी फेंक दिया जाता है।

@interface SWViewController() { 
    UICollisionBehavior *coll; 
    UIDynamicAnimator *dynamicAnimator; 
} 

@implementation SWViewController 
- (void)viewDidLoad { 
    [super viewDidLoad]; 
    dynamicAnimator = [[UIDynamicAnimator alloc] initWithReferenceView:self.view]; 
} 

- (void)viewDidAppear:(BOOL)animated { 
    [super viewDidAppear:animated]; 
    [self setupCollisions]; // commenting this out fixes the layout 
} 

- (void)setupCollisions { 
    NSArray *dynamicViews = @[greenView]; 
    coll = [[UICollisionBehavior alloc] initWithItems:dynamicViews];  
    CGFloat topBound = CGRectGetMinY(greenView.frame); 
    [coll addBoundaryWithIdentifier:@"top" 
         fromPoint:CGPointMake(0, h1) 
          toPoint:CGPointMake(CGRectGetWidth(greenView.frame), h1)];  
    [dynamicAnimator addBehavior:coll]; 
} 

अगर मैं didRotateFromInterfaceOrientation ओवरराइड मैं देख सकता हूँ कि greenView के शीर्ष सीमा (setupCollisions फिक्स यह करने के लिए कॉल को हटाने के लिए फिर से,) का पालन नहीं करता क्या autolayout का कहना है यह होना चाहिए: यहाँ कोड है।

greenView पर autolayout सीमाएं हैं:

height = 200 
trailing space to Superview = 0 
leading space to Superview = 0 
bottom space to Superview = 0 
+0

हाय, मुझे लगता है कि आप टकराव व्यवहार यहाँ का उपयोग कर रहे |: एच:

मैं एक और बाधा जोड़कर तय की। गुरुत्वाकर्षण व्यवहार के बिना यह क्या करता है? धन्यवाद। – Unheilig

+0

इस उदाहरण में, मैं गुरुत्वाकर्षण व्यवहार का भी उपयोग नहीं कर रहा हूं। अगर मैं इसे बाहर कर देता हूं तो यह वही काम करता है। – swilliams

+1

मैं इस विषय पर डब्ल्यूडब्ल्यूडीसी वीडियो देखने की अत्यधिक अनुशंसा करता हूं। इस साल से सत्र 206 और 221। https://developer.apple.com/wwdc/videos/ यदि आपके पास है तो SO पर अपने स्वयं के प्रश्न बनाएं। – swilliams

उत्तर

2

एक समाधान मैंने पाया willRotateToInterfaceOrientation: ओवरराइड और UIDynamicItems हटाने और फिर उन्हें didRotateFromInterfaceOrientation: में फिर से जोड़ने के लिए किया गया था। यह मुझे हैकी के रूप में हमला करता है, और जब मैं अधिक जटिल व्यवहार जोड़ता हूं तो संभावित रूप से बग पेश कर सकता है।

+0

मैं वास्तव में इस समस्या के उत्तर के रूप में इसे नहीं खरीदता, क्योंकि एनिमेटर के व्यवहार को दोबारा जोड़कर, एनीमेशन खुद को दोहराता है, और प्रत्येक घूर्णन पर ऐसा करने के लिए ... सुरुचिपूर्ण नहीं है। –

+0

मुझे बेहतर लगेगा (कृपया)! क्योंकि हाँ, मुझे चीजों की स्थिति को ट्रैक करना था और ध्यान से व्यवहार को फिर से लागू करना था ताकि एनिमेशन अव्यवस्थित न हों और दोहराएं। – swilliams

+0

क्या आपको इसके लिए बेहतर समाधान मिला? खासकर आईओएस 8 के साथ .. – Jan

0

गतिशील एनिमेटर शामिल विचारों के फ्रेम बदल रहा है। नतीजतन किसी भी एनीमेशन को -[UIView setNeedsLayout] पर कॉल से परेशान किया जाएगा (दृश्य गतिशील एनीमेशन स्थिति पर ध्यान दिए बिना बाधाओं को संचालित स्थिति में डाल दिया जाएगा।

मेरा अवलोकन यह है कि आप ऑटो-जेनरेटेड लेआउट बाधाओं का उपयोग करते हैं, गतिशील एनिमेटर उन्हें हटा देता है किसी भी दृश्य एनीमेशन में शामिल

आप अपने स्वयं के लेआउट की कमी जोड़ते हैं -। वे जारी रहती है -। लेकिन अपने एनीमेशन को परेशान कर सकते हैं जब व्यू लेआउट पुनर्गणना के लिए पूछा जाता है

0

दोगुना अपने ऑटो लेआउट की कमी की जांच करें

मेरे पास बहुत सिम था (0) - - [MyView], वी: [MyView] - (0) - | |:, एच ilar समस्या: वी:

मेरे मामले में, मैं एक subview, MyView, जो बाधाओं का एक सेट था है : [MyView: (== 300)], और यह UIDynamics के साथ अच्छा काम करता है। लेकिन UVynamics को MyView में जोड़ने के बाद, रोटेशन के दौरान चौड़ाई बदल गई, जो आपकी समस्या के समान है। (0) - - [MyView]

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