Apple định nghĩa khá rõ ràng cách phân lớp UIView
trong tài liệu.
Kiểm tra danh sách dưới đây, đặc biệt hãy xem initWithFrame:
và layoutSubviews
. Cái trước được dự định để thiết lập khung của bạn UIView
trong khi cái trước được dự định để thiết lập khung và bố cục của các cuộc phỏng vấn của nó.
Cũng nên nhớ rằng initWithFrame:
nó chỉ được gọi nếu bạn đang khởi tạo UIView
chương trình của mình . Nếu bạn đang tải nó từ tệp nib (hoặc bảng phân cảnh), initWithCoder:
sẽ được sử dụng. Và trong initWithCoder:
khung chưa được tính toán, vì vậy bạn không thể sửa đổi khung bạn đã thiết lập trong Trình tạo giao diện. Như được đề xuất trong câu trả lời này, bạn có thể nghĩ đến việc gọi initWithFrame:
từ initWithCoder:
để thiết lập khung.
Cuối cùng, nếu bạn tải UIView
từ ngòi (hoặc bảng phân cảnh), bạn cũng có awakeFromNib
cơ hội thực hiện khởi tạo khung và bố cục tùy chỉnh, kể từ khi awakeFromNib
được gọi, đảm bảo rằng mọi chế độ xem trong cấu trúc phân cấp đã không được lưu trữ và khởi tạo.
Từ tài liệu của NSNibAwaking
(bây giờ được thay thế bởi tài liệu của awakeFromNib
):
Tin nhắn đến các đối tượng khác có thể được gửi một cách an toàn từ bên trong awakeFromNib, khi đó nó đảm bảo rằng tất cả các đối tượng không được lưu trữ và khởi tạo (tất nhiên là không nhất thiết phải được đánh thức)
Cũng đáng lưu ý rằng với tính năng tự động thanh toán, bạn không nên đặt khung rõ ràng cho chế độ xem của mình. Thay vào đó, bạn phải chỉ định một tập hợp các ràng buộc đủ, để khung được tự động tính toán bởi công cụ bố trí.
Trực tiếp từ tài liệu :
Phương pháp ghi đè
Khởi tạo
initWithFrame:
Chúng tôi khuyên bạn nên thực hiện phương pháp này. Bạn cũng có thể thực hiện các phương thức khởi tạo tùy chỉnh ngoài, hoặc thay vì phương thức này.
initWithCoder:
Thực hiện phương pháp này nếu bạn tải chế độ xem của mình từ tệp nib của Trình tạo giao diện và chế độ xem của bạn yêu cầu khởi tạo tùy chỉnh.
layerClass
Chỉ thực hiện phương pháp này nếu bạn muốn chế độ xem của mình sử dụng lớp Hoạt hình lõi khác cho cửa hàng sao lưu của nó. Ví dụ: nếu bạn đang sử dụng OpenGL ES để thực hiện bản vẽ của mình, bạn sẽ muốn ghi đè phương thức này và trả về lớp CAEAGLLayer.
Vẽ và in
drawRect:
Thực hiện phương pháp này nếu chế độ xem của bạn vẽ nội dung tùy chỉnh. Nếu chế độ xem của bạn không thực hiện bất kỳ bản vẽ tùy chỉnh nào, hãy tránh ghi đè phương thức này.
drawRect:forViewPrintFormatter:
Chỉ thực hiện phương pháp này nếu bạn muốn vẽ nội dung của chế độ xem khác nhau trong khi in.
Những ràng buộc
requiresConstraintBasedLayout
Thực hiện phương thức lớp này nếu lớp xem của bạn yêu cầu các ràng buộc để hoạt động đúng.
updateConstraints
Thực hiện phương pháp này nếu chế độ xem của bạn cần tạo các ràng buộc tùy chỉnh giữa các lần xem trước của bạn.
alignmentRectForFrame:
, frameForAlignmentRect:
Triển khai các phương thức này để ghi đè cách các chế độ xem của bạn được căn chỉnh với các chế độ xem khác.
Bố trí
sizeThatFits:
Thực hiện phương pháp này nếu bạn muốn chế độ xem của mình có kích thước mặc định khác với kích thước thông thường trong quá trình thay đổi kích thước. Ví dụ: bạn có thể sử dụng phương pháp này để ngăn chế độ xem của bạn thu nhỏ đến điểm mà các cuộc phỏng vấn không thể được hiển thị chính xác.
layoutSubviews
Thực hiện phương pháp này nếu bạn cần kiểm soát chính xác hơn bố cục của các cuộc phỏng vấn của mình hơn là các hành vi ràng buộc hoặc tự động hóa cung cấp.
didAddSubview:
, willRemoveSubview:
Thực hiện các phương pháp này khi cần thiết để theo dõi các bổ sung và loại bỏ các cuộc phỏng vấn.
willMoveToSuperview:
, didMoveToSuperview
Triển khai các phương thức này khi cần thiết để theo dõi chuyển động của chế độ xem hiện tại trong phân cấp chế độ xem của bạn.
willMoveToWindow:
, didMoveToWindow
Thực hiện các phương pháp này khi cần thiết để theo dõi chuyển động của chế độ xem của bạn sang một cửa sổ khác.
Xử lý sự kiện:
touchesBegan:withEvent:
, touchesMoved:withEvent:
, touchesEnded:withEvent:
, touchesCancelled:withEvent:
Thực hiện các phương pháp này nếu bạn cần để xử lý các sự kiện liên lạc trực tiếp. (Đối với đầu vào dựa trên cử chỉ, hãy sử dụng nhận dạng cử chỉ.)
gestureRecognizerShouldBegin:
Thực hiện phương pháp này nếu chế độ xem của bạn xử lý các sự kiện chạm trực tiếp và có thể muốn ngăn nhận dạng cử chỉ đính kèm kích hoạt các hành động bổ sung.