2013-07-16 38 views
5

Tôi có chế độ xem cuộn trong ứng dụng của mình, được khởi tạo qua bảng phân cảnh và tôi đang cố gắng thay đổi khung. Mọi thứ dường như hoạt động, nhưng nếu kích thước khung hình và nội dung được truy cập chỉ trong một thời gian ngắn sau khi chúng được thiết lập, nhưng sau khi phương thức của tôi trả về, chúng khác nhau! Đây là mã:UIScrollView thay đổi khung hình và kích thước nội dung một cách bí ẩn

CGFloat inputHeight = inputView.frame.size.height; 
originalContentHeight = self.scrollableContentView.frame.size.height; 
NSLog(@"%f", self.scrollableContentView.frame.size.height-inputHeight); 
[self.scrollableContentView setFrame:CGRectMake(self.scrollableContentView.frame.origin.x, self.scrollableContentView.frame.origin.y, self.scrollableContentView.frame.size.width, self.scrollableContentView.frame.size.height-inputHeight)]; 
NSLog(@"%f", self.scrollableContentView.frame.size.height); 
NSLog(@"%@", self.scrollableContentView); 

Sản lượng của các bản ghi này đều như mong đợi, đó là:

<UIScrollView: 0x808de00; frame = (0 0; 320 81); ... > 

Tuy nhiên, nếu tôi đặt một breakpoint trong phương pháp khác, vào thời điểm đó được gọi là, đăng các scrollview thấy điều này:

<UIScrollView: 0x808de00; frame = (0 0; 320 416); ... > 

Bên cạnh đó, những thay đổi kích thước nội dung như vậy:

(width=320, height=416) 

để

(width=320, height=504) 

Cả hai giá trị dường như được quay trở lại tự động đến các giá trị mà họ có khi xem là lần đầu tiên đặt ra. Tôi đã đặt breakpoint trong getter và setter của khung nhìn cuộn của tôi, và không thể tìm thấy bất kỳ truy cập bất ngờ, vì vậy tôi đã kết luận rằng sự thay đổi phải đến nội bộ. Đây có phải là một kết luận chính đáng? Điều gì có thể xảy ra?

+0

Bạn có thể đặt lò xo tự động đặt thành độ cao có thể điều chỉnh không? – Jamie

+0

Tôi sẽ tìm thấy ở đâu? – Jumhyn

+0

Điều này là do bố cục tự động. Hoặc tắt tính năng đó hoặc thay đổi kích thước của chế độ xem cuộn bằng cách điều chỉnh các ràng buộc thay vì đặt khung. – rdelmar

Trả lời

6

Nếu bạn đang sử dụng autolayout, bạn nên thay đổi các ràng buộc, không đặt khung của scrollview.

Xem câu trả lời của tôi cho một câu hỏi tương tự here. Nó có một số liên kết đến các ví dụ về cách thiết lập các ràng buộc theo lập trình.

Ngoài ra, trong đó phương pháp nào bạn đang đặt framecontentSize? Vì bạn đang sử dụng bảng phân cảnh, nếu nó nằm trong số viewDidLoad hoặc viewWillAppear:, thay vào đó, bạn nên chuyển mã này sang viewDidLayoutSubviews.

+0

Tôi thực sự có mã trong 'viewDidLayoutSubviews' (theo lịch sử câu hỏi của tôi). Tôi sẽ thử điều này sau ngày hôm nay. – Jumhyn

+1

Hạn chế là con đường để đi. Tôi thực sự thấy rằng cách tốt nhất để làm điều đó là thêm một ổ cắm vào ràng buộc trong Interface Builder, và sau đó chỉnh sửa thuộc tính 'constant'. – Jumhyn

+0

@Jumhyn Vâng, tôi cũng thấy đó là một cách dễ dàng để thay đổi ràng buộc nếu nó đã tồn tại trong bảng phân cảnh. Tôi vui vì bạn đã làm nó hoạt động! –

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