5

Nếu tôi thêm bất kỳ loại UIDynamicBehavior vào chế độ xem của mình, nó sẽ phá vỡ hoàn toàn mọi thứ khi thiết bị được xoay. Dưới đây là nó là gì trong bức chân dung (hiển thị một cách chính xác):UIDynamics và Xoay thiết bị

Correct Layout

Và ở đây nó là trong bối cảnh, tất cả đã phá vỡ: Broken layout

Tôi không tin rằng đó là một vấn đề autolayout vì nếu tôi loại bỏ các cuộc gọi để thêm các UIDynamicBehavior nó hoạt động tốt với không có vấn đề autolayout. Không có lỗi autolayout bao giờ được ném một trong hai. Dưới đây là các mã:

@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]; 
} 

Nếu tôi ghi đè didRotateFromInterfaceOrientation Tôi có thể thấy rằng ranh giới đầu greenView không làm theo những gì autolayout nói nó nên (một lần nữa, loại bỏ các cuộc gọi đến setupCollisions bản sửa lỗi này).

Các ranh giới autolayout trên greenView là:

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

Xin chào, tôi thấy bạn đang sử dụng Hành vi Va chạm ở đây. Điều này làm gì mà không có hành vi trọng lực? Cảm ơn. – Unheilig

+0

Trong ví dụ này, tôi thậm chí không sử dụng một hành vi trọng lực. Nếu tôi chuyển nó ra nó cũng giống như vậy. – swilliams

+1

Tôi rất muốn giới thiệu xem các video WWDC về chủ đề này. Phiên 206 và 221 từ năm nay. https://developer.apple.com/wwdc/videos/ Tạo câu hỏi của riêng bạn trên SO nếu bạn có chúng. – swilliams

Trả lời

2

Một giải pháp tôi thấy được để ghi đè willRotateToInterfaceOrientation: và loại bỏ các UIDynamicItems và sau đó lại thêm chúng vào didRotateFromInterfaceOrientation:. Điều này tấn công tôi như là khá hacky, và có khả năng có thể giới thiệu lỗi khi tôi thêm hành vi phức tạp hơn.

+0

Tôi không thực sự mua điều này như là một câu trả lời cho vấn đề này, bởi vì bằng cách áp dụng lại hành vi cho người làm phim hoạt hình, hoạt ảnh lặp lại chính nó, và để làm điều đó trên mỗi vòng quay ... không thanh lịch. –

+0

Tôi rất muốn thấy một cái tốt hơn (vui lòng)! Bởi vì có, tôi phải theo dõi tình trạng của mọi thứ và cẩn thận áp dụng lại các hành vi để các hình ảnh động không bị nói lắp và lặp lại. – swilliams

+0

Bạn có tìm thấy giải pháp tốt hơn cho việc này không? Đặc biệt với iOS8 .. – Jan

0

Trình làm hoạt ảnh động đang thay đổi khung của các chế độ xem có liên quan. Kết quả là bất kỳ hoạt ảnh nào sẽ bị quấy rầy bởi một cuộc gọi đến -[UIView setNeedsLayout] (số lượt xem sẽ được đặt vào các vị trí điều khiển hạn chế bất kể trạng thái hoạt ảnh động)

Quan sát của tôi là bạn sử dụng các ràng buộc bố cục được tạo tự động. bất kỳ quan điểm liên quan đến các hình ảnh động

Nếu bạn thêm những hạn chế bố trí của riêng bạn -. họ kiên trì -. nhưng có thể làm xáo trộn hoạt hình của bạn khi xem được yêu cầu tính toán lại bố trí

0

Vui lòng kiểm tra hạn chế bố trí tự động của bạn tăng gấp đôi

.

Tôi đã có một sim rất ilar problem:

Trong trường hợp của tôi, tôi có một chế độ xem con, MyView, có một tập hợp các ràng buộc: V: | - (0) - [MyView], V: [MyView] - (0) - |, H : [MyView: (== 300)], và nó hoạt động tốt với UIDynamics. Nhưng sau khi thêm UIDynamics vào MyView, chiều rộng thay đổi trong khi xoay, điều này rất giống với vấn đề của bạn.

Tôi đã sửa nó bằng cách thêm một ràng buộc nữa: H: | - (0) - [MyView]