Thay đổi UIButton BorderColor trong Storyboard


79

Tôi đặt CornerRadius và BorderWidth cho nút giao diện người dùng trong Thuộc tính thời gian chạy do người dùng xác định. Không cần thêm layer.borderColor nó hoạt động tốt và Hiển thị đường viền màu đen. Nhưng khi add layer.borderColor không hoạt động (không hiển thị đường viền).

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

Câu trả lời:


158

Đối với Swift:

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

Swift 3:

extension UIView {

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

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

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

Swift 2.2:

extension UIView {

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

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

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

xin chào tôi đang tạo lớp CustomeView trong mục tiêu c nhưng nó không hiển thị trong bảng phân cảnh của tôi. Xin hãy giúp tôi.
Pooja Srivastava

Cảm ơn rất nhiều vì điều này! :)
Vijay VS

Cảm ơn, Awesome, Perfect
Abo3atef

1
Gọn gàng, tuy nhiên XCode (Phiên bản 8.3.3 (8E3004b)) không hiển thị kết quả trong bản xem trước, điều này có đúng và không có cách nào để thay đổi (ngoại trừ việc tạo chế độ xem tùy chỉnh)?
Konstantin Berkov

Đây là giải pháp thanh lịch nhất! Công việc tốt!
Zoltan Vinkler

88

Tôi có câu trả lời. Thay đổi borderColor thay vì layer.borderColor :

Đoạn mã Xcode

và thêm mã này vào tệp .m:

#import <QuartzCore/QuartzCore.h>
@implementation CALayer (Additions)

- (void)setBorderColorFromUIColor:(UIColor *)color
{
    self.borderColor = color.CGColor;
}

@end

Đánh dấu thuộc tính trong Trình kiểm tra thuộc tính

Trình kiểm tra thuộc tính


5
@jithin Tôi đã viết nó dưới dạng tiện ích mở rộng Swift, đây là mã: tiện ích mở rộng CALayer {func setBorderColorFromUIColor (màu: UIColor) {self.borderColor = color.CGColor}}
Guy

thủ thuật đã hoạt động. một phần. Làm thế nào mà tôi nhận được màu viền đen mặc dù tôi đã chỉ định màu đỏ? !!!!!! bất kỳ ý tưởng? bất kỳ ai?
static0886

@ static0886: Đó là do màu bạn đang áp dụng không được đặt thành đường viền. Theo hiểu biết của tôi, chúng tôi không thể đặt màu viền từ bảng phân cảnh vì thuộc tính này sẽ không được phản ánh trong UIComponent trong thời gian chạy. Theo mặc định, nó là màu đen. Nếu bạn muốn dùng thử bằng cách xóa thuộc tính màu khỏi Thuộc tính.
Javeed

Để nhanh chóng, bạn có thể đặt nó là: self.button.layer.borderColor = <UIColor.CGColor>
Sam

Layer.borderColorFromUIColor đó đã làm việc cho tôi trong bảng câu chuyện. Cảm ơn bạn.
Ramakrishna

50

Swift 4, Xcode 9.2 - Sử dụng IBDesignableIBInspectableđể xây dựng các điều khiển tùy chỉnh và xem trước trực tiếp thiết kế trong Trình tạo giao diện.

Đây là một mã mẫu trong Swift, đặt ngay bên dưới UIKittrong ViewController.swift:

@IBDesignable extension UIButton {

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

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

    @IBInspectable var borderColor: UIColor? {
        set {
            guard let uiColor = newValue else { return }
            layer.borderColor = uiColor.cgColor
        }
        get {
            guard let color = layer.borderColor else { return nil }
            return UIColor(cgColor: color)
        }
    }
}

Nếu bạn đi tới Thuộc tính có thể kiểm tra của dạng xem, bạn sẽ tìm thấy các thuộc tính này một cách trực quan, chỉnh sửa các thuộc tính:

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

Các thay đổi cũng được phản ánh trong Thuộc tính thời gian chạy do người dùng xác định:

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

Chạy trong thời gian xây dựng và Thì đấy! bạn sẽ thấy nút tròn rõ ràng có viền.

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


Điều này đã giúp tôi đạt được nó trong bảng phân cảnh. Câu trả lời của bạn là rất rõ ràng để thực hiện.
R. Mohan

Đây là câu trả lời chính xác nhất cho câu hỏi này với ví dụ được giải thích rõ ràng.
SeaWarrior404,

Nếu bạn có thể thêm Objective-C, nó sẽ được đánh giá cao.
Mihir Oza

9

Lời giải thích, có lẽ bị mất trong một số câu trả lời khác ở đây:

Lý do mà thuộc tính này không được đặt là layer.borderColorcần một giá trị với kiểu CGColor.

Nhưng chỉ UIColorcó thể đặt các loại thông qua Thuộc tính thời gian chạy do người dùng xác định của Trình tạo giao diện!

Vì vậy, bạn phải đặt UIColor thành thuộc tính proxy thông qua Trình tạo giao diện, sau đó chặn lệnh gọi đó để đặt CGColor tương đương cho thuộc layer.borderColortính.

Điều này có thể được thực hiện bằng cách tạo một Category trên CALayer, đặt Key Path thành một "thuộc tính" mới duy nhất ( borderColorFromUIColor) và trong danh mục ghi đè setter ( setBorderColorFromUIColor:) tương ứng .


1

Có một cách tốt hơn nhiều để làm điều này! Bạn nên sử dụng @IBInspectable. Kiểm tra mục blog của Mike Woelmer tại đây: https://spin.atomicobject.com/2017/07/18/swift-interface-builder/

Nó thực sự bổ sung tính năng IB trong Xcode! Một số ảnh chụp màn hình trong các câu trả lời khác làm cho nó xuất hiện như thể các trường tồn tại trong IB, nhưng ít nhất trong Xcode 9 thì không. Nhưng sau bài viết của anh ấy sẽ thêm chúng.


Tôi đã thử cách tiếp cận này và nó làm cho Xcode thực sự chậm. Nó có xảy ra với tất cả các bạn không?
Meep

0

Trong trường hợp Swift, chức năng không hoạt động. Bạn sẽ cần một thuộc tính được tính toán để đạt được kết quả mong muốn:

extension CALayer {
    var borderColorFromUIColor: UIColor {
        get {
            return UIColor(CGColor: self.borderColor!)
        } set {
            self.borderColor = newValue.CGColor
        }
    }
}

0

Điều này làm việc cho tôi.

Swift 3, Xcode 8.3

Người kiểm tra danh tính (UIButton trong trường hợp này

Phần mở rộng CALayer:

extension CALayer {
var borderWidthIB: NSNumber {
    get {
        return NSNumber(value: Float(borderWidth))
    }
    set {
        borderWidth = CGFloat(newValue.floatValue)
    }
}
var borderColorIB: UIColor? {
    get {
        return borderColor != nil ? UIColor(cgColor: borderColor!) : nil
    }
    set {
        borderColor = newValue?.cgColor
    }
}
var cornerRadiusIB: NSNumber {
    get {
        return NSNumber(value: Float(cornerRadius))
    }
    set {
        cornerRadius = CGFloat(newValue.floatValue)
    }
}

}

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.