2015-06-03 18 views
7

Tôi đang thử một số nội dung với CATiledLayer bên trong UIScrollView.Làm thế nào để phát hiện khi kích thước UIView được thay đổi trong xos ios nhanh?

Bằng cách nào đó, kích thước của UIView bên trong UIScrollView được thay đổi thành một số lớn. Tôi cần phải tìm hiểu chính xác những gì đang gây ra thay đổi kích cỡ này.

Có cách nào để phát hiện khi kích thước của UIView (khung, giới hạn) hoặc contentSize của UIScrollView được thay đổi kích cỡ không?

tôi đã cố gắng

override var frame: CGRect { 
    didSet { 
     println("frame changed"); 
    } 
} 

bên UIView phân lớp,

nhưng nó chỉ được gọi một lần khi ứng dụng khởi động, mặc dù kích thước của UIView được thay đổi kích cỡ sau đó.

+0

Thử ghi đè bố cục funcSubviews() – Greg

+0

Có thể trùng lặp của [Có sự kiện thay đổi kích thước UIView không?] (Http://stackoverflow.com/questions/4000664/is-there-a-uiview-resize-event) –

Trả lời

18

viewWillLayoutSubviews()viewDidLayoutSubviews() sẽ được gọi bất cứ khi nào thay đổi giới hạn. Trong bộ điều khiển xem.

2

Câu trả lời là chính xác, mặc dù đối với trường hợp của tôi, các ràng buộc tôi thiết lập trong bảng phân cảnh khiến kích thước UIView thay đổi mà không cần gọi lại bất kỳ chức năng phát hiện nào.

+0

Có lẽ tôi hiểu lầm. Nhưng AFAIK bất cứ điều gì đang xảy ra là kết quả của các ràng buộc sẽ hiển thị trong bản xem trước bố cục - trong trình chỉnh sửa Trợ lý. – simons

3

Bạn cũng có thể sử dụng KVO:

Bạn có thể đặt một KVO như thế này, nơi viewview bạn muốn quan sát khung thay đổi:

self.addObserver(view, forKeyPath: "center", options: NSKeyValueObservingOptions.New, context: nil) 

Và bạn có thể nhận được những thay đổi với thông báo này:

override func observeValueForKeyPath(keyPath: String!, ofObject object: AnyObject!, change: NSDictionary!, context: CMutableVoidPointer) { 
    } 

Th e observeValueForKeyPath sẽ được gọi bất cứ khi nào khung của chế độ xem bạn đang quan sát các thay đổi.

Cũng nên nhớ để loại bỏ các quan sát viên khi xem của bạn là về để được deallocated:

view.removeObserver(self, forKeyPath:@"center") 
+1

KVO trên UIKit có thể xảy ra bất cứ lúc nào. Vì vậy, chỉ nên được sử dụng như một phương sách cuối cùng và được chuẩn bị để nó thất bại trong các phiên bản tương lai của iOS. Nhìn vào câu trả lời này từ một kỹ sư UIKit của iOS: http://stackoverflow.com/a/6051404/251394 – srik

1

BƯỚC 1: viewWillLayoutSubviews

gọi để thông báo cho người điều khiển quan điểm cho rằng quan điểm của mình là sắp bố trí các tiểu cảnh của nó

Khi giới hạn của chế độ xem thay đổi, chế độ xem sẽ điều chỉnh vị trí của các phụ đề . Bộ điều khiển chế độ xem của bạn có thể ghi đè phương pháp này để thực hiện các thay đổi trước khi chế độ xem đưa ra các bản xem trước của nó. Việc thực thi mặc định của phương thức này không làm gì cả.

BƯỚC 2: viewDidLayoutSubviews

gọi để thông báo cho người điều khiển quan điểm cho rằng quan điểm của mình vừa đặt ra subviews của nó.

Khi giới hạn thay đổi cho chế độ xem của bộ điều khiển chế độ xem, chế độ xem điều chỉnh vị trí của các bản xem trước và sau đó hệ thống gọi phương thức này là . Tuy nhiên, phương pháp này được gọi là không chỉ ra rằng bố cục riêng lẻ của các bản xem trước của chế độ xem đã được điều chỉnh. Mỗi tiểu sử chịu trách nhiệm điều chỉnh bố cục của riêng nó.

Trình điều khiển chế độ xem của bạn có thể ghi đè phương pháp này để thực hiện thay đổi sau chế độ xem sẽ hiển thị các bản xem phụ của nó. Việc triển khai mặc định phương thức này không làm gì cả.

Trên các phương pháp này được gọi là bất cứ khi nào giới hạn của UIView được thay đổi

11

Có một câu trả lời ở đây:

https://stackoverflow.com/a/27590915/5160929

Chỉ cần dán bên ngoài này của một cơ thể phương pháp:

override var bounds: CGRect { 
    didSet { 
     // Do stuff here 
    } 
} 
+1

Tốt nhất cho UIScrollView (vì không thể truy cập viewWillLayoutSubviews()) Chỉ cần thông báo rằng nó có thể được gọi nhiều lần và cẩn thận không thay đổi giới hạn trong nó, nó sẽ vô cùng – Yitzchak

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