2015-08-27 26 views
16

Tôi là nhà phát triển Android đang học iOS. Làm thế nào để bạn thêm đệm (inset) vào UILabel trong iOS Swift? Tôi đã không thành công trong việc tìm kiếm một hướng dẫn dễ dàng về điều này. Cảm ơn bạn.Làm thế nào để bạn thêm inset vào UILabel (iOS Swift)?

Ngoài ra, làm cách nào tôi có thể thêm lề vào các phần tử giao diện người dùng trong Swift? Khi tôi thử dưới đây, không có gì được cập nhật (khi nhấn "thêm ràng buộc").

enter image description here

+0

đăng phân đoạn mã mà bạn đã thử. sau đó bạn sẽ có thể phân loại nó nhanh chóng! –

Trả lời

21

Có lẽ ý tưởng tốt nhất là để phân lớp UILabel và ghi đè drawTextInRect: như thế này:

class InsetLabel: UILabel { 
    override func drawTextInRect(rect: CGRect) { 
     super.drawTextInRect(UIEdgeInsetsInsetRect(rect, UIEdgeInsets(top: 0, left: 20, bottom: 0, right: 20))) 
    } 
} 
+0

Tôi mới sử dụng Swift. Làm cách nào để sử dụng? Tôi mới sử dụng Swift và iOS. @Sebyddd – andy7586

+0

@ andy7586 - Tôi đã cập nhật câu trả lời. Thay vì tạo nhãn của lớp 'UILabel', hãy đặt nó thành lớp 'InsetLabel'. Thêm triển khai lớp này ở đâu đó trong tệp .swift của bạn. – Sebyddd

+0

Một câu hỏi khác, làm cách nào tôi có thể thêm ký quỹ vào bất kỳ phần tử giao diện người dùng nào?Khi tôi cố gắng đặt thủ công (xem câu hỏi được cập nhật), không có gì được cập nhật. – andy7586

9

cần thêm này:

class InsetLabel: UILabel { 
let topInset = CGFloat(12.0), bottomInset = CGFloat(12.0), leftInset = CGFloat(12.0), rightInset = CGFloat(12.0) 

override func drawTextInRect(rect: CGRect) { 
    let insets: UIEdgeInsets = UIEdgeInsets(top: topInset, left: leftInset, bottom: bottomInset, right: rightInset) 
    super.drawTextInRect(UIEdgeInsetsInsetRect(rect, insets)) 
} 

override func intrinsicContentSize() -> CGSize { 
    var intrinsicSuperViewContentSize = super.intrinsicContentSize() 
    intrinsicSuperViewContentSize.height += topInset + bottomInset 
    intrinsicSuperViewContentSize.width += leftInset + rightInset 
    return intrinsicSuperViewContentSize 
} 
} 
36

Đây là mã bạn cần phải thêm vào Swift 3:

class InsetLabel: UILabel { 
    let topInset = CGFloat(0) 
    let bottomInset = CGFloat(0) 
    let leftInset = CGFloat(20) 
    let rightInset = CGFloat(20) 

    override func drawText(in rect: CGRect) { 
     let insets: UIEdgeInsets = UIEdgeInsets(top: topInset, left: leftInset, bottom: bottomInset, right: rightInset) 
     super.drawText(in: UIEdgeInsetsInsetRect(rect, insets)) 
    } 

    override public var intrinsicContentSize: CGSize { 
     var intrinsicSuperViewContentSize = super.intrinsicContentSize 
     intrinsicSuperViewContentSize.height += topInset + bottomInset 
     intrinsicSuperViewContentSize.width += leftInset + rightInset 
     return intrinsicSuperViewContentSize 
    } 
} 
+1

Cảm ơn :) Con đường để đi ... – Abo3atef

2

Có một giải pháp đơn giản là sử dụng bảng phân cảnh. Trong bảng phân cảnh, tạo một đối tượng UIView có mục đích là bao quanh nhãn của bạn để cho nó đệm. Sau đó, cũng từ bảng phân cảnh, hãy đặt UILabel của bạn vào trong chế độ xem đó. Bây giờ chọn đối tượng UILabel và mở cửa sổ Add New Constraints bằng cách nhấn vào biểu tượng "Pin". Nếu bạn muốn một phần đệm của 5 tất cả các con đường xung quanh UILabel, nhấp vào mỗi trong số 4 I-beam màu đỏ trong cửa sổ Add New Constraints, và THEN type 5 trong mỗi 4 ô liền kề với I-beam. Nếu bạn gõ 5 đầu tiên và sau đó nhấp vào một I-Beam, XCode sẽ chuyển về bất kỳ giá trị nào trong hộp trước khi bạn nhập 5. Cuối cùng, hãy nhấp vào nút Thêm Ràng buộc.

Trong cửa sổ bật lên Thêm Ràng buộc, XCode bỏ qua các giá trị ràng buộc trên cùng, bên trái, bên phải hoặc dưới mà bạn chưa nhấp vào chùm I-đỏ tương ứng. Điều này có thể trả lời phần thứ hai của câu hỏi của bạn.

Hãy nhớ cũng thiết lập các ràng buộc của UIView bạn đã thêm. Nếu bạn không xác định vị trí của nó trong bảng phân cảnh (ví dụ: được ghim vào trên cùng và bên trái của giao diện chính của trình điều khiển chế độ xem), nó sẽ không được gán vị trí mặc định và nó có thể không hiển thị khi bạn chạy ứng dụng của bạn.

+1

Giải pháp tốt nhất cho đến nay –

0

Một cách khác sẽ được ghi đè textRect: forBounds: limitedToNumberOfLines:

Trả về hình chữ nhật vẽ cho văn bản của nhãn. Ghi đè phương pháp này trong các lớp con yêu cầu thay đổi trong hình chữ nhật bị ràng buộc của nhãn để xảy ra trước khi hệ thống thực hiện bố cục văn bản khác tính toán. Sử dụng giá trị trong tham số numberOfLines để giới hạn chiều cao của hình chữ nhật được trả lại cho số dòng được chỉ định văn bản. Phương pháp này có thể được gọi bởi hệ thống nếu có cuộc gọi trước đến phương thức sizeToFit() hoặc sizeThatFits (_ :). Lưu ý rằng các nhãn trong các đối tượng UITableViewCell có kích thước dựa trên kích thước ô và không phải là với kích thước được yêu cầu.

public class JPSLabel : UILabel 
{ 
    open var textInsets: UIEdgeInsets = UIEdgeInsets.zero 

    override public func textRect(forBounds bounds: CGRect, limitedToNumberOfLines numberOfLines: Int) -> CGRect 
    { 
     var insetBounds = super.textRect(forBounds: bounds, limitedToNumberOfLines: numberOfLines) 
     insetBounds.size.width += self.textInsets.left + self.textInsets.right 
     insetBounds.size.height += self.textInsets.top + self.textInsets.bottom 

     return insetBounds 
    } 
} 
Các vấn đề liên quan