Làm cách nào để đặt màu viền tùy chỉnh của UIView theo lập trình?


99

Tôi đang cố gắng đặt màu viền tùy chỉnh của UIView theo lập trình trong Swift.


3
Hiển thị mã liên quan trong câu hỏi của bạn. Giải thích vấn đề bạn đang gặp phải.
rmaddy

1
Có thể trùng lặp với Cocoa Touch: Làm thế nào để thay đổi độ dày và màu viền của UIView? bạn chỉ cần sử dụng nó theo cách Swifty
Inder Kumar Rathore

Câu trả lời:


202

Nếu bạn sử dụng Swift 2.0+

self.yourView.layer.borderWidth = 1
self.yourView.layer.borderColor = UIColor(red:222/255, green:225/255, blue:227/255, alpha: 1).cgColor

Lưu ý: điều này dường như không hiệu quả với tôi (có lẽ vì tôi đang sử dụng nhanh 3.1?). Paras Joshi của ( stackoverflow.com/a/29701061/225813 ) phiên bản đã làm công việc mặc dù
Ashley coolman

Tôi đã chỉnh sửa câu trả lời của mình. nó chắc chắn sẽ hiệu quả với bạn .. Ashley Coolman
Shashi Verma

1
Bạn không cần phải gọi init rõ ràng trong nhanh chóng 3.
ibrahimab

Có thể sử dụng nhiều hơn một màu không?
Gökhan Çokkeçeci

3
Có sự khác biệt nào giữa hai phiên bản của bạn?
Fogmeister

88

Trong Swift 4, bạn có thể đặt màu và chiều rộng đường viền thành UIControls bằng cách sử dụng mã bên dưới.

let yourColor : UIColor = UIColor( red: 0.7, green: 0.3, blue:0.1, alpha: 1.0 )
yourControl.layer.masksToBounds = true
yourControl.layer.borderColor = yourColor.CGColor
yourControl.layer.borderWidth = 1.0

<Swift 4 , Bạn có thể đặt chiều rộng đường viền và màu đường viền của UIView bằng cách sử dụng mã bên dưới.

yourView.layer.borderWidth = 1

yourView.layer.borderColor = UIColor.red.cgColor

1
@ShashiVerma bạn được chào đón. Để xem chi tiết sâu về các lớp, đọc các tài liệu tham khảo lớp đối tượng khác nhau táo, vì vậy đó cũng là hữu ích cho bạn :)
Paras Joshi

16

Sử dụng @IBDesignable@IBInspectable để làm tương tự.

Chúng có thể tái sử dụng, dễ dàng sửa đổi từ Trình tạo giao diện và các thay đổi được phản ánh ngay lập tức trong Bảng phân cảnh

Biến đổi các đối tượng trong bảng phân cảnh thành lớp cụ thể

Đoạn mã:

@IBDesignable
class CustomView: UIView{

@IBInspectable var borderWidth: CGFloat = 0.0{

    didSet{

        self.layer.borderWidth = borderWidth
    }
}


@IBInspectable var borderColor: UIColor = UIColor.clear {

    didSet {

        self.layer.borderColor = borderColor.cgColor
    }
}

override func prepareForInterfaceBuilder() {

    super.prepareForInterfaceBuilder()
}

}

Cho phép sửa đổi dễ dàng từ Trình tạo giao diện:

Trình tạo giao diện


Tôi thích giải pháp này hơn vì nó là giải pháp có thể tái sử dụng, nơi chúng tôi đặt UIView thành chế độ xem tùy chỉnh nhưng vẫn để lại nhiều thay đổi hơn.
n0rm,

Đây là cách yêu thích của tôi để đạt được nó nhưng với chế độ tối, nó không thực sự hoạt động tốt. Nó có kiểu màu của MacOS hiện tại và sử dụng tĩnh. Nhưng xây dựng @IBDesignable@IBInspectabletất cả đều hoạt động tốt, vì vậy cần có cách để hải quan sử dụng Tài sản màu với cả chế độ tối / sáng ~ có ai biết làm thế nào có thể đạt được nó không?
Nhà phát triển Nomad

12

Bạn có thể viết một phần mở rộng để sử dụng nó với tất cả các UIViews, ví dụ. UIButton, UILabel, UIImageView, v.v. Bạn có thể tùy chỉnh phương pháp sau của tôi theo yêu cầu của bạn, nhưng tôi nghĩ nó sẽ hoạt động tốt cho bạn.

extension UIView{

    func setBorder(radius:CGFloat, color:UIColor = UIColor.clearColor()) -> UIView{
        var roundView:UIView = self
        roundView.layer.cornerRadius = CGFloat(radius)
        roundView.layer.borderWidth = 1
        roundView.layer.borderColor = color.CGColor
        roundView.clipsToBounds = true
        return roundView
    }
}

Sử dụng:

btnLogin.setBorder(7, color: UIColor.lightGrayColor())
imgViewUserPick.setBorder(10)

1
@luda Tôi không nghĩ anh ấy / cô ấy có nhiều lựa chọn về ngôn ngữ api!
valuewords

8

nhanh chóng 3

func borderColor(){

    self.viewMenuItems.layer.cornerRadius = 13
    self.viewMenuItems.layer.borderWidth = 1
    self.viewMenuItems.layer.borderColor = UIColor.white.cgColor
}

8

Swift 5.2 , UIView + Tiện ích mở rộng

extension UIView {
    public func addViewBorder(borderColor:CGColor,borderWith:CGFloat,borderCornerRadius:CGFloat){
        self.layer.borderWidth = borderWith
        self.layer.borderColor = borderColor
        self.layer.cornerRadius = borderCornerRadius

    }
}

Bạn đã sử dụng tiện ích mở rộng này;

yourView.addViewBorder(borderColor: #colorLiteral(red: 0.6, green: 0.6, blue: 0.6, alpha: 1), borderWith: 1.0, borderCornerRadius: 20)

bạn đã bỏ lỡ thêm clipToBounds = true
Bent El-Eslam

3

Viết mã trong viewDidLoad()

self.view.layer.borderColor = anyColor().CGColor

Và bạn có thể đặt ColorvớiRGB

func anyColor() -> UIColor {
    return UIColor(red: 0.0/255.0, green: 0.0/255.0, blue: 0.0/255.0, alpha: 1.0)
}

Tìm hiểu điều gì đó về CALayertrongUIKit


Bằng cách nào đó, nó không có tác dụng gì trừ khi bạn cũng đặt chiều rộng đường viền một cách rõ ràng.
Nicolas Miari

@NicolasMiari được mong đợi ... bạn không thể thấy màu đường viền mà bạn chưa đặt kích thước.
Jono Guthrie

Xin lỗi, tôi đã quên đề cập đến việc tôi đang đề cập đến các trường văn bản ... dường như có chiều rộng đường viền mặc định khác 0 ngay từ đầu. Tuy nhiên, tôi đã cố gắng làm cho màu sắc mà tôi đặt được phản ánh, cho đến khi tôi đặt rõ ràng chiều rộng đường viền.
Nicolas Miari,

3

nhanh chóng 3.0

self.uiTextView.layer.borderWidth = 0.5
    self.txtItemShortDes.layer.borderColor = UIColor(red:205.0/255.0, green:205.0/255.0, blue:205.0/255.0, alpha: 1.0).cgColor

3

Chúng tôi có thể tạo phương pháp cho nó. Đơn giản chỉ cần sử dụng nó.

public func createBorderForView(color: UIColor, radius: CGFloat, width: CGFloat = 0.7) {
    self.layer.borderWidth = width
    self.layer.cornerRadius = radius
    self.layer.shouldRasterize = false
    self.layer.rasterizationScale = 2
    self.clipsToBounds = true
    self.layer.masksToBounds = true
    let cgColor: CGColor = color.cgColor
    self.layer.borderColor = cgColor
}

2

Swift 3.0

       groundTrump.layer.borderColor = UIColor.red.cgColor

Thay vì thêm một câu trả lời mới, bạn phải đã gửi yêu cầu chỉnh sửa để người trả lời ban đầu
Rajan Maheshwari

@RajanMaheshwari Vui lòng không. Đừng thêm mã vào câu trả lời của người khác. Cập nhật nên được đăng dưới dạng của riêng họ, không phải vào các câu trả lời khác. Bằng cách đó mỗi tấm áp phích có trách nhiệm cho những gì họ đăng ...
Eric Aya

@EricAya không phải là cập nhật câu trả lời. Đó là một yêu cầu chỉnh sửa, có thể nằm trong nhận xét cho người trả lời. Bạn đã hiểu những gì tôi đang cố gắng truyền đạt.
Rajan Maheshwari
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.