2009-07-01 13 views
191

UIView có các thuộc tính frame, bounds, centerorigin và tất cả đều có liên quan với nhau. Hầu hết thời gian, tôi xử lý frame khi đặt vị trí và kích thước của UIView. Tôi hiểu rằng frame đang sử dụng hệ thống tọa độ toàn cầu và bounds đang sử dụng tọa độ của chế độ xem cục bộ (do đó x và y của nó là 0, nhưng không phải lúc nào), nhưng nó vẫn gây nhầm lẫn cho tôi khi sử dụng cái gì.Khung hình, giới hạn, trung tâm, nguồn gốc của UIView, khi nào nên sử dụng cái gì?

Theo ngữ cảnh nào (và thời điểm thích hợp) các thuộc tính khác (bounds, center, origin) nên được sử dụng?

+0

Các liên kết dưới đây có câu trả lời tốt nhất. http://stackoverflow.com/questions/5361369/uiview-frame-bounds-and-center – Ohmy

+0

Frame vs Bounds with pictures: http://stackoverflow.com/a/28917673/3681880 – Suragch

Trả lời

235

Marco của câu trả lời trên là chính xác, nhưng chỉ để mở rộng về vấn đề "theo những gì bối cảnh" ...

khung - đây là tài sản mà bạn thường xuyên nhất sử dụng cho các ứng dụng iPhone bình thường. hầu hết các điều khiển sẽ được đặt ra tương đối so với điều khiển "chứa" để frame.origin sẽ trực tiếp tương ứng với nơi điều khiển cần hiển thị và frame.size sẽ xác định mức độ lớn để thực hiện điều khiển.

center - đây là thuộc tính mà bạn có khả năng sẽ tập trung vào các trò chơi và hoạt ảnh dựa trên sprite nơi di chuyển hoặc chia tỷ lệ có thể xảy ra. Theo mặc định hoạt hình và xoay sẽ được dựa trên trung tâm của UIView. Nó hiếm khi có ý nghĩa để thử và quản lý các đối tượng như vậy bởi thuộc tính khung.

giới hạn - thuộc tính này không phải là thuộc tính định vị, nhưng xác định khu vực có thể kéo của UIView "tương đối" với khung. Theo mặc định, thuộc tính này thường là (0, 0, chiều rộng, chiều cao). Thay đổi thuộc tính này sẽ cho phép bạn vẽ bên ngoài khung hoặc giới hạn vẽ đến một khu vực nhỏ hơn trong khung. Một cuộc thảo luận tốt về điều này có thể được tìm thấy tại liên kết dưới đây. Nó là không phổ biến cho tài sản này được thao tác trừ khi có nhu cầu cụ thể để điều chỉnh khu vực vẽ. Ngoại lệ duy nhất là hầu hết các chương trình sẽ sử dụng [[UIScreen mainScreen] bounds] khi khởi động để xác định vùng hiển thị cho ứng dụng và thiết lập khung UIView ban đầu của chúng cho phù hợp.

Why is there an frame rectangle and an bounds rectangle in an UIView?

Hy vọng rằng điều này giúp làm rõ các trường hợp mỗi tài sản có thể được sử dụng.

+31

Tôi nghĩ rằng nó đáng giá thêm rằng 'bounds' thường được sử dụng khi một khung nhìn có một biến đổi được áp dụng cho nó. Trong những trường hợp này, thuộc tính 'frame' là không xác định. Như được chỉ ra bởi các câu trả lời khác, việc sửa đổi 'center' và' bounds' tương đương với việc thay đổi vị trí và kích thước của khung nhìn tương ứng. – Stuart

17

Các thuộc tính center, boundsframe được khóa liên động: thay đổi một sẽ cập nhật những người khác, vì vậy hãy sử dụng chúng theo cách bạn muốn. Ví dụ: thay vì sửa đổi các tham số x/y của frame để thu lại chế độ xem, chỉ cần cập nhật thuộc tính center.

35

Chúng là các giá trị có liên quan và được giữ nguyên theo phương thức setter/getter (và sử dụng khung thực tế là giá trị tổng hợp hoàn toàn, không được hỗ trợ bởi một biến mẫu thực).

Các phương trình chính là:

frame.origin = center - bounds.size/2 

(mà cũng giống như)

center = frame.origin + bounds.size/2 

(và cũng có)

frame.size = bounds.size 

Đó không phải mã, chỉ cần phương trình để diễn tả sự bất biến giữa ba thuộc tính. Các phương trình này cũng cho rằng biến đổi của khung nhìn của bạn là nhận dạng, theo mặc định. Nếu không, thì giới hạn và trung tâm giữ nguyên nghĩa, nhưng khung có thể thay đổi. Trừ khi bạn đang thực hiện phép xoay góc không đúng, khung sẽ luôn là chế độ xem được chuyển đổi theo các tọa độ của người giám sát.

thứ này được tất cả các giải thích chi tiết hơn với một hữu ích mini-thư viện ở đây:

http://bynomial.com/blog/?p=24