2013-02-13 14 views
44

Tôi đang tìm cách thêm thuộc tính padding vào UIView. Lý tưởng nhất, tôi muốn tránh subclassing và đặt nó trong một thể loại. Việc sử dụng sẽ là một cái gì đó như:Thêm phần đệm vào UIView

myview.padding = UIEdgeInsetsMake(10, 10, 10, 10); 

Và có lẽ có một tài sản paddingBox cũng đó sẽ trả về một CGRect mô tả kích thước và vị trí của hộp đệm bên trong.

Bây giờ, làm cách nào một người sẽ triển khai trong danh mục giống như vậy. Ban đầu tôi mặc dù sử dụng bounds, nhưng tiếc là kích thước của bounds được liên kết với kích thước của frame (luôn giống nhau) chỉ các tọa độ có thể khác nhau.

Trả lời

38

Điều này thường được thực hiện bằng cách đặt các giới hạn trong chế độ xem. Vì vậy, nếu bạn muốn một inset của 10 tất cả các vòng bạn có thể làm:

view.bounds = CGRectInset(view.frame, 10.0f, 10.0f); 

Các giới hạn xác định khu vực có thể kéo của khung nhìn, liên quan đến khung. Vì vậy, điều này sẽ cho hiệu quả một padding. Sau đó bạn có thể nhận được 'paddingBox' chỉ từ giới hạn.

Hy vọng điều này sẽ hữu ích! :)

+3

Điều này cũng làm thay đổi kích thước của chế độ xem. Như tôi đã đề cập trong câu hỏi của tôi, các tài liệu nói rằng 'Kích thước của hình chữ nhật viền được ghép với kích thước của hình chữ nhật khung, để thay đổi thành một ảnh hưởng đến ảnh khác.'. Nói cách khác, mã bạn đăng phải có -10 không 10 và thậm chí như vậy, nó sẽ chỉ thêm phần đệm trên cùng và bên trái, nhưng tôi sẽ kiểm tra lại, chỉ để chắc chắn rằng tôi không thiếu gì đó. – Meda

+0

Bạn có liên kết đến tài liệu không, vì tôi khá chắc chắn rằng kích thước của các giới hạn và khung có thể khác nhau? –

+0

http://stackoverflow.com/questions/749558/why-is-there-an-frame-rectangle-and-an-bounds-rectangle-in-an-uiview và http://stackoverflow.com/questions/1071112/uiviews-frame-bounds-center-origin-khi-to-use-thông tin tốt về điều này là gì. –

7

Điều bạn thực sự phải làm là tạo chế độ xem và thêm chế độ xem phụ vào đó. Tạo một khung cảnh nền và đặt khung hình mà bạn muốn. Sau đó, làm cho khung phụ thứ hai khung bạn muốn với các cạnh insets.

UIView backgroundView = new UIView(CGRect.FromLTRB(0, 0, 100, 100)) 
{ 
    BackgroundColor = backgroundGray, 
}; 

//Will have a right edge inset of 10 
UIView edgyView = new UIView(CGRect.FromLTRB(0, 0, 90, 100)) 
{ 
    BackgroundColor = backgroundGray, 
} 

backgroundView.AddSubview(edgyView); 
15

Cập nhật cho Swift 3

view.bounds = view.frame.insetBy(dx: 10.0, dy: 10.0) 

:)

2

Bạn có thể ghi đè thuộc tính alignmentRectInsets. Dưới đây là ví dụ trong Swift 4

class YourCustomView: UIView { 

    override var alignmentRectInsets: UIEdgeInsets { 
     return UIEdgeInsets(top: 10, left: 10, bottom: 10, right: 10) 
    } 
}