2013-06-10 40 views
10

tôi gặp sự cố lạ trên một tác vụ rất đơn giản.Hoạt ảnh chỉnh lại kích thước AutoLayout và UILabel không hoạt động bình thường trên xoay thiết bị

Tôi cần một thiết lập rất nhỏ để tạo lại vấn đề:

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

Trong ví dụ trên chúng ta có một cái nhìn mẹ với 2 subviews -> Một UILabel và một UIView đơn giản. Im sử dụng autolayout để áp dụng cách bố trí hiển thị ở trên:

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). 

Vì vậy, những gì tôi mong đợi với thiết lập này, là cả hai subviews sẽ áp dụng toàn bộ chiều rộng của mẹ như chúng ta định nghĩa rằng ở đầu và đuôi không gian có thể không. do đó, nếu thay đổi chiều rộng của chế độ xem gốc, chiều rộng của các bản xem trước cũng sẽ thay đổi, để luôn được căn chỉnh.

cho phép nói chế độ xem gốc có kích thước 200x400 pt. khi tôi xây dựng và chạy ví dụ của tôi trong bức chân dung, mọi thứ sẽ ổn. khi tôi xoay ngang, mọi thứ vẫn ổn. chiều rộng của chế độ xem gốc và thậm chí chiều rộng của bản xem trước cũng lớn hơn. nhưng bây giờ khi tôi xoay trở lại chân dung các UILabels rộng ngay lập tức trở nên rộng mục tiêu của mình mà không cần bất kỳ hình ảnh động:

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

phụ huynh quan điểm rộng và UIView subviews chiều rộng là động đúng cách. của nó chỉ có uilabel có một hành vi kỳ lạ ở đây và tôi không thể tìm ra những gì gây ra vấn đề đó.

+0

Bạn có đang tạo phân cấp và ràng buộc theo chương trình không? Trong trường hợp đó, bạn đã thiết lập translatesAutoresizingMaskIntoConstraints thành NO? –

+0

bạn đã tìm ra điều này? Tôi gặp vấn đề tương tự – user18853

Trả lời

0

Vấn đề không phải là UILabel không hoạt ảnh thay đổi kích thước của nó nhưng văn bản không hoạt ảnh. Nếu bạn để cho nhãn một màu nền khác nhau, bạn sẽ thấy rằng nó thực sự animate, và nó chỉ là văn bản mà nhảy đến vị trí.

Một cách để khắc phục điều này là thay đổi chiều rộng của nhãn mà không có hoạt ảnh và di chuyển nó bằng điểm X, trong đó X là một nửa sự khác biệt giữa độ rộng bắt đầu và kết thúc, và sau đó chỉ tạo hiệu ứng vị trí của nó.

Vấn đề duy nhất với phương pháp này đối với mã của bạn là tôi không tin rằng bạn sẽ có thể làm điều đó với bố cục tự động.

0

Như tôi đã nhớ, đối với các ràng buộc, bạn nên cung cấp một số thông số kỹ thuật khác, nhưng đối với các yếu tố giao diện người dùng dễ dàng như vậy, tôi sẽ đề xuất sử dụng mặt nạ UIViewAutoresizing. Chúng đơn giản hơn nhiều và có định nghĩa ngắn hơn. Trong trường hợp của bạn, chỉ cần sử dụng UIViewAutoresizingFlexibleWidth.

0

Tốt hơn là đặt autolayout trong story board. Hãy đảm bảo rằng bạn là tất cả các khung nhìn phụ được chọn trong bộ điều khiển xem của bạn khi bạn đang thiết lập các ràng buộc. Cho rằng bạn nên làm như sau:

  1. Bấm vào quan điểm của bộ điều khiển giao diện chính của bạn
  2. Nhấn Ctrl+A
  3. Bấm Resolve Auto-bố trí vấn đề
  4. Chọn Add hạn chế mất tích trong View Controller của bạn

Sau đó, ràng buộc sẽ được đặt thành tất cả các bản xem trước và sẽ hoạt động hoàn hảo trong khi xoay.

1

gợi ý của tôi là:

Nếu bạn đã subclassed quan điểm cha mẹ sử dụng - (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); 
} 

nếu bạn không subclassed quan điểm cha mẹ bạn có thể sử dụng autoresizingMask:

label.autoresizingMask = UIViewAutoresizingFlexibleWidth; 
childView.autoresizingMask = UIViewAutoresizingFlexibleWidth;