2010-09-18 36 views
7

Đăng lần đầu tiên trên tràn ngăn xếp.UIView và AutoresizingMask bị bỏ qua

Tôi đã dành hàng giờ cọ rửa trên nhiều tìm kiếm của Google và có, tại thời điểm này, thực tế đã ghi nhớ tài liệu tham chiếu lớp UIView và UIViewController. Bất kể tôi làm gì, ứng dụng của tôi đều bỏ qua những nỗ lực của tôi để thay đổi kích thước quan điểm của tôi về thay đổi định hướng (hoặc bất kỳ sửa đổi kích thước khung hình nào khác cho vấn đề đó.)

Không có ngòi bút hoặc xib; Tôi đang xây dựng tất cả các quan điểm của tôi và viewcontrollers lập trình, và họ (các viewcontrollers) là tất cả các lớp con của một trong ba lớp con UIViewController tùy chỉnh mà tôi đã tạo ra. Những lớp học siêu có các dòng sau trong loadView của họ: Phương pháp ...

[self setView:[[[UIView alloc] initWithFrame:[self viewFrame]] autorelease]]; 
[[self view] setAutoresizingMask:(UIViewAutoresizingFlexibleWidth | UIViewAutoresizingFlexibleHeight)]; 
[[self view] setAutoresizesSubviews:TRUE]; 

Trong tất cả các phương pháp setter thích hợp (bất cứ nơi nào tôi thêm một subview nói cách khác) Tôi lặp lại các bước của việc áp dụng autoresizingMask. Dường như không có vấn đề gì tôi làm, kết quả luôn luôn giống nhau - tôi nhấp vào xây dựng, nhấp vào gỡ lỗi, đợi ứng dụng khởi chạy, xoay thiết bị và ưu tiên! Chế độ xem quay nhưng không đổi kích thước.

Tôi thiếu gì ở đây? Nó có thể là một cái gì đó hiển nhiên rằng tôi chỉ không nhìn thấy. Bất kỳ trợ giúp nào thực sự được đánh giá cao, cảm ơn trước.

Trả lời

33

Vâng, chắc chắn đủ, đó là lỗi của riêng tôi.

Bài học số một:Bạn không tự làm gì bằng cách thức cả đêm để sửa mã bị hỏng. Nghỉ ngơi chút đi! Uống nhiều nước hơn! Bạn sẽ chỉ có thể làm cho mọi thứ tồi tệ hơn nếu bạn tiếp tục cố gắng để buộc bộ não của bạn để thực hiện chiến lược thuật toán phức tạp và logic qua thời gian ngủ của nó.

Hóa ra tôi có UIView giả mạo về phía dưới cùng của hệ thống phân cấp chế độ xem mà không có thuộc tính tự động hóa nào cả. Tôi nghĩ rằng tôi đã xem xét tất cả mọi thứ, nhưng hóa ra tôi đã bỏ lỡ một. (Chỉ một chế độ xem nhỏ và cả ngày chụp!)

Tôi có thể nói cho bất kỳ ai đến sau với sự thất vọng tương tự, rằng Autoresizing thực sự hoạt động như được ghi lại. Nếu bạn nghĩ rằng "một cái gì đó không được gọi là" thì có thể bạn đang tìm kiếm ở vị trí sai. Ngoài ra, các hằng số enum UIViewAutoresizingMask không được sử dụng chính xác như trong Interface Builder. Trong IB, bạn "khóa" lề, trong khi thiết lập chúng theo lập trình, các lề bị khóa được giả định theo mặc định và bạn "mở khóa" chúng bằng cách đặt nó là "Linh hoạt". Vì vậy, ví dụ, chỉ thiết lập các bit FlexibleWidth và FlexibleHeight tương đương với việc cho phép tất cả các tùy chọn tự động hóa trong IB. Bằng cách ném vào bất kỳ mặt nạ lề nào (ví dụ: UIViewAutoresizingFlexibleLeftMargin), bạn đang "bỏ chọn" tùy chọn tự động hóa ký quỹ tương ứng trong IB. (Tôi đã nhìn thấy nhiều bài viết khác trôi nổi xung quanh nơi đây dường như là một điểm nhầm lẫn chính đối với một số người.)

Trong nghiên cứu của mình, tôi đã nhận thấy rằng dường như không có bất kỳ sự kiện nào, tin nhắn, thông báo, hoặc nếu không khi một UIView được thay đổi kích cỡ, cho dù tự động hay không. Mặc dù không cần thiết để thay đổi kích thước các khung nhìn con, sẽ rất tuyệt khi biết khi nào xảy ra trong trường hợp bạn muốn tạo scrollView hoặc tableView để cuộn nếu kích thước khung của nó thay đổi. Tôi biết người ta có thể dễ dàng làm điều này khi bàn phím bật lên, bởi vì có một hệ thống thông báo xung quanh đó cũng như các phương pháp TextFielddelegate. Vì vậy, có thể là chủ đề cho bài đăng khác ...

Dù sao, cảm ơn tất cả những người tham gia StackOverflow!

+2

Ghi đè -setFrame: là một cách khá đáng tin cậy để thấy rằng lượt xem đã thay đổi kích thước. – aksommerville

+0

Ồ vâng, chắc chắn! Tôi sử dụng kỹ thuật đó tất cả thời gian khi gỡ lỗi giữ lại số lượng, nhưng tôi thường bỏ qua làm điều đó trong các tình huống khác như thế này. (Làm thế nào rõ ràng evasive rõ ràng có thể được.) Để làm rõ bình luận của bạn cho người khác, điều này là đề cập đến overriding -setFrame để nhổ lên một số NSLog cho bạn biết tên của khung nhìn và một số giá trị khung. (Đừng quên gọi triển khai của siêu nếu bạn thử điều này.) – quickthyme

+0

Ngoài ra, tôi sẽ không sử dụng phương pháp đó cho bất kỳ thứ gì khác. Tôi cũng sẽ làm cho dure để vô hiệu hóa ghi đè trước khi phát hành mã như sản xuất. – quickthyme

Các vấn đề liên quan