Khung của UIView, giới hạn, trung tâm, nguồn gốc, khi nào nên sử dụng cái gì?


195

UIViewcó các thuộc tính frame, bounds, center, và origin, và tất cả họ dường như được với nhau. Hầu hết thời gian, tôi xử lý framekhi đặt vị trí và kích thước của a UIView. Tôi hiểu rằng frameđang sử dụng hệ 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 luôn luôn), nhưng tôi vẫn bối rối khi sử dụng cái gì.

Theo những gì bối cảnh các tài sản khác (và đúng thời điểm là những gì) ( bounds, center, origin) nên được sử dụng?


Các liên kết dưới đây có câu trả lời tốt nhất. stackoverflow.com/questions/5361369/ cường
Ohmy

Khung so với giới hạn có hình ảnh: stackoverflow.com/a/28917673/3681880
Suragch

Câu trả lời:


240

Câu trả lời của Marco ở trên là chính xác, nhưng chỉ để mở rộng câu hỏi "trong bối cảnh nào" ...

khung - đây là tài sản bạn thường sử dụng nhất cho các ứng dụng iPhone thông thường. hầu hết các điều khiển sẽ được đặt ra liên quan đến điều khiển "chứa", do đó frame.origin sẽ tương ứng trực tiếp 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.

trung tâm - đây là tài sản bạn có thể sẽ tập trung vào các trò chơi và hoạt hình dựa trên sprite nơi chuyển động hoặc tỷ lệ có thể xảy ra. Theo mặc định, hoạt ảnh và xoay sẽ 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 vùng có thể vẽ 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 hạn chế vẽ ở 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. Không có gì lạ khi tài sản này bị thao túng trừ khi có nhu cầu cụ thể để điều chỉnh vùng vẽ. Ngoại lệ duy nhất là hầu hết các chương trình sẽ sử dụng khi [[UIScreen mainScreen] bounds]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.

Tại sao có một hình chữ nhật khung và một hình chữ nhật giới hạn trong một UIView?

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


33
Tôi nghĩ rằng đáng để thêm rằng boundsthường được sử dụng khi chế độ xem có một biến đổi được áp dụng cho nó. Trong những trường hợp framenày tài sản là không xác định. Như được chỉ ra bởi các câu trả lời khác, sửa đổi centerboundstương đương với sửa đổi vị trí và kích thước của chế độ xem tương ứng.
Stuart

36

Chúng là các giá trị liên quan và được duy trì nhất quán bởi các phương thức setter / getter thuộc tính (và sử dụng thực tế là khung là một giá trị được tổng hợp hoàn toàn, không được hỗ trợ bởi một biến đối tượng thực tế).

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

frame.origin = center - bounds.size / 2

(giống như)

center = frame.origin + bounds.size / 2

(và cũng có)

frame.size = bounds.size

Đó không phải là mã, chỉ là phương trình để biểu thị 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à danh tính, theo mặc định. Nếu không, giới hạn và trung tâm giữ cùng một nghĩa, nhưng khung có thể thay đổi. Trừ khi bạn thực hiện các góc quay không phải, khung hình sẽ luôn là chế độ xem được chuyển đổi theo các tọa độ của giám sát.

Những thứ này được giải thích chi tiết hơn với một thư viện nhỏ hữu ích ở đây:

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


18

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

Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.