Sử dụng Storyboard để che UIView và cung cấp các góc tròn?


99

Rất nhiều câu hỏi như thế này giải thích cách tạo mặt nạ theo chương trình và cung cấp các góc tròn cho UIView.

Có cách nào để làm tất cả trong Storyboard không? Chỉ hỏi vì có vẻ như việc tạo các góc tròn trong Storyboard giúp phân định rõ ràng hơn giữa bản trình bày và logic.


Có thể trùng lặp của Set viền cho UIButton trong Storyboard
bummi

Câu trả lời:


264

Vâng, tôi sử dụng nó rất nhiều nhưng câu hỏi như thế này đã được trả lời nhiều lần.

Nhưng dù sao thì trong Interface Builder. Bạn cần thêm Thuộc tính thời gian chạy do người dùng xác định như sau:

layer.masksToBounds Boolean YES
layer.cornerRadius Number {View's Width/2}

nhập mô tả hình ảnh ở đây

và kích hoạt

Clips subviews

nhập mô tả hình ảnh ở đây

Các kết quả:

nhập mô tả hình ảnh ở đây


tôi có thể thêm Thuộc tính thời gian chạy do người dùng xác định ở đâu?
Henson Fang

Như tôi đã hiển thị trong chọn xem hình ảnh đầu tiên sau đó vào cửa sổ bên phải chọn thứ ba biểu tượng User Defined Runtime Thuộc tính Bấm vào mục bên dưới để thêm đường dẫn quan trọng, chủng loại, giá trị
Woraphot Chokratanasombat

1
Bạn có thể làm cho bán kính đường viền động để nó luôn bằng 50% chiều rộng hay nó cần phải là một số nguyên tĩnh?
Crashalot

1
Theo như tôi biết, giá trị cố định chỉ.
Woraphot Chokratanasombat

1
Chỉ FYI, nếu giống như tôi, bạn đến đây nghĩ rằng điều này sẽ hoạt động trên LaunchScreen.storyboard, thì không. Bạn sẽ nhận được: Error: Launch screens may not use user defined runtime attributes. Có vẻ như nếu bạn cần một hình ảnh tròn trên LaunchScreen, bạn đã hết lựa chọn.
Mã Knox

22

Bạn có thể làm điều đó trong bảng phân cảnh bằng cách sử dụng các thuộc tính do người dùng xác định. Chọn dạng xem mà bạn muốn làm tròn và mở Trình kiểm tra danh tính của nó. Trong phần Thuộc tính thời gian chạy do người dùng xác định , hãy thêm hai mục sau:

  • Đường dẫn chính:, layer.cornerRadiusLoại: Số, Giá trị: (bất kỳ bán kính nào bạn muốn)
  • Đường dẫn khóa:, layer.masksToBoundsLoại: Boolean, Giá trị: đã chọn

Bạn có thể phải nhập QuartzKittệp lớp tương ứng trong chế độ xem của mình (nếu có), nhưng tôi thề rằng tôi đã làm cho nó hoạt động mà không cần làm điều đó. Kết quả của bạn có thể khác nhau.

CHỈNH SỬA: Ví dụ về bán kính động

extension UIView {

    /// The ratio (from 0.0 to 1.0, inclusive) of the view's corner radius
    /// to its width. For example, a 50% radius would be specified with
    /// `cornerRadiusRatio = 0.5`.
    @IBDesignable public var cornerRadiusRatio: CGFloat {
        get {
            return layer.cornerRadius / frame.width
        }

        set {
            // Make sure that it's between 0.0 and 1.0. If not, restrict it
            // to that range.
            let normalizedRatio = max(0.0, min(1.0, newValue))
            layer.cornerRadius = frame.width * normalizedRatio
        }
    }

}

Tôi đã xác minh rằng điều này hoạt động trong một sân chơi.


1
Bạn có thể làm cho bán kính đường viền động để nó luôn bằng 50% chiều rộng hay nó cần phải là một số nguyên tĩnh?
Crashalot

5
Bạn có thể, nhưng chỉ trong mã. Tuy nhiên, một giải pháp thú vị là thêm thuộc tính IBInspectable vào lớp của chế độ xem của bạn, đó là một giá trị số từ 0 đến 100 và cho biết phần trăm chiều rộng mà bán kính phải có. Ví dụ: giá trị 50 có nghĩa là bán kính phải bằng 50% chiều rộng. Vì đó là một thuộc tính được tính toán (không được lưu trữ), bạn thậm chí có thể thêm nó vào phần mở rộng của UIView để tất cả các chế độ xem đều có thể có thuộc tính.
NRitH

@NRitH, tôi muốn thấy một cái gì đó như vậy. Bạn có nghĩ rằng bạn có thể đăng mã ở đây?
Cobie Fisher

17

Chọn chế độ xem bạn đã thay đổi Corner Rediuse, Border Widthe và Border Color cũng bằng StoryBord

extension UIView {

    @IBInspectable var cornerRadiusV: CGFloat {
        get {
            return layer.cornerRadius
        }
        set {
            layer.cornerRadius = newValue
            layer.masksToBounds = newValue > 0
        }
    }

    @IBInspectable var borderWidthV: CGFloat {
        get {
            return layer.borderWidth
        }
        set {
            layer.borderWidth = newValue
        }
    }

    @IBInspectable var borderColorV: UIColor? {
        get {
            return UIColor(cgColor: layer.borderColor!)
        }
        set {
            layer.borderColor = newValue?.cgColor
        }
    }
}

3
tại sao lại sử dụng angleRadiusV thay vì angleRadius?
luhuiya

1
nó được thiết lập cornerRadius sử dụng các kịch bản thông qua, tiết kiệm văn bản mã hóa trong dự án
Ananda Aiwale

Làm việc hoàn hảo
Hassan Tareq

0

Ngay cả sau khi thực hiện tất cả các thay đổi trong bảng phân cảnh, câu trả lời của Woraphot không phù hợp với tôi.

Điều này đã làm việc cho tôi:

layer.cornerRadius = 10
layer.borderWidth = 1
layer.borderColor = UIColor.blue.cgColor

Câu trả lời dài :

Góc tròn của UIView / UIButton, v.v.

customUIView.layer.cornerRadius = 10

Độ dày viền

pcustomUIView.layer.borderWidth = 1

Màu viền

customUIView.layer.borderColor = UIColor.blue.cgColor

Điều này không cố gắng trả lời câu hỏi và chỉ là bản sao của câu trả lời khác của bạn ở đây .
shim
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.