2013-08-15 27 views
21

Tôi có một vấn đề với các frame-bất động sản trong iOS 7. Tôi muốn thay đổi kích thước một số UIViews trong viewDidLoad -method của UIViewController của tôi, nhưng nếu tôi làm điều đó như int screenHeight = [[UIScreen mainScreen] bounds].size.height; [self.leftSideTableView setFrame: CGRectMake(0, 0, 320, screenHeight)]; chiều cao được thiết lập như tôi muốn nó cho đến khi kết thúc của phương pháp, nhưng trong mọi phương pháp khác nó là như là đã được trước!Thiết khung của một UIView không hoạt động

Có vấn đề gì với nó hoặc nó chỉ là lỗi của trình biên dịch hay bất kỳ thứ gì khác?

+0

Bạn có thể làm rõ điều gì sai không? Tôi không chắc bạn muốn nói gì. –

+0

Đây là tiếng Anh của tôi hay tôi đã giải thích nó như thế nào? : D Vì vậy, UIView không thay đổi kích thước! NSLog cho thấy, có giá trị đúng trong đó, nhưng nó chỉ đến khi kết thúc phương thức! Trong mọi phương thức khác mà trình biên dịch thực hiện sau khi viewDidLoad nó là giá trị cũ! :/ – MyJBMe

+0

Thử đặt khung của 'UIView' trong 'chế độ xemDidLayoutSubviews' hoặc' viewWillAppear'. Các khung nhìn chưa được đặt ra trong 'viewDidLoad'. – bobnoble

Trả lời

70

Bạn phải đặt kích thước chế độ xem thành -viewDidLayoutSubviews:! (documentation)

Đặt thay đổi khung nhìn thành -viewWillAppear: hoặc -viewDidLoad: sẽ không hoạt động, vì chế độ xem chưa được đặt ra!

+4

Cảm ơn vì điều này. Đếm trên Apple để thay đổi suy nghĩ của họ trên một ý thích và giới thiệu những thay đổi hành vi khó chịu cho những điều cực kỳ cơ bản đã làm việc kể từ khi phát hành 1.0. –

+1

Trên thực tế, điều này không hoạt động. viewDidLayoutSubviews được gọi và giá trị của khung thay đổi, nhưng hình ảnh vẫn được kéo dài, giống như initWithFrame: trong viewWillAppear. Sử dụng mã này. CGRect frame = self.navigationItem.titleView.frame; frame.size.width = 102; frame.size.height = 44; self.navigationItem.titleView.frame = frame; –

+0

Chỉ cần lưu ý. iOS7 và iOS8 hoạt động khác nhau. trên iOS7 thay đổi khung của một subview gây nên layoutSubview, trên iOS8 điều này không xảy ra. – aryaxt

1

Có một số lý do khiến điều này có thể xảy ra. Trước hết, bạn cần phải chắc chắn rằng tableview của bạn không phải là không. Nếu bạn đang tạo nó theo lập trình, bạn cần phải chắc chắn rằng bạn đang gọi alloc/init ở đâu đó trước khi bạn cố gắng thiết lập frame. Nếu self.leftSideTableView là một IBOutlet, điều này có thể được gây ra do quên thực sự liên kết ổ cắm với đối tượng giao diện. Sau đó, thứ hai và ít có khả năng hơn, bạn đang tạo chế độ xem bảng theo chương trình và khởi chạy đúng cách, nhưng bạn quên thêm nó làm chế độ xem phụ của một trong các chế độ xem trên màn hình của bạn.

+0

TableView được tạo trong nib và được liên kết và bây giờ tôi muốn thay đổi kích thước nó! Tôi cũng thấy nó trên màn hình, và nó được làm đầy, nhưng tôi không thể thay đổi chiều cao! – MyJBMe

+0

@MyJBMe Bạn đang sử dụng một lớp con của UITableViewController? –

+0

Không, UITableView bình thường của nó! Nhưng @bobnoble vừa mang lại câu trả lời! Tôi không thể thay đổi kích thước trong viewDidLoad - ngay cả khi tôi có thể đặt bóng - nhưng tôi có thể đặt trong viewDidLayoutSubviews! viewWillAppear cũng không làm được! – MyJBMe

11
  • Kiểm tra xem bạn có đang sử dụng autolayout trong tệp xib của mình không. Nếu bạn không muốn sử dụng autolayout, hãy bỏ chọn nó trong tệp xib của bạn.

  • Thay đổi khung self.leftSideTableView của bạn trong -viewWillAppear:.

7

Kiểm tra để đảm bảo rằng bố cục tự động không được kích hoạt trong tệp bảng phân cảnh của bạn.

Để tắt tính năng này, hãy xem thanh tra trong trình tạo giao diện. Nhấp vào biểu tượng trông giống như một trang ở bên trái. Trong phần "Interface Builder Document" bỏ chọn "Use Auto Layout".

Tôi thấy nó tốt nhất cho toàn bộ bộ điều khiển chế độ xem trong IB với bố cục tự động hoặc hoàn toàn bằng mã. Trộn hai có thể dẫn đến hành vi kỳ lạ khó gỡ lỗi.

+0

vô hiệu hóa tính năng tự động làm việc cho tôi! Cảm ơn bạn! –

+0

Người đàn ông, tôi đập đầu của tôi về điều này trong nhiều giờ (facepalm). Cảm ơn! – Sobakus

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