Có thể đặt thuộc tính viền UIView từ trình tạo giao diện không?


184

Có thể kiểm soát các thuộc tính viền UIView (màu sắc, độ dày, v.v.) trực tiếp từ trình tạo giao diện hay tôi chỉ có thể thực hiện theo chương trình?



1
Chỉ trong trường hợp bất cứ ai đến từ Google như tôi đã làm. Để xem những thay đổi đó phản ánh trong IB, bạn chỉ cần tạo một lớp con của UIView và gán nó cho bất kỳ Chế độ xem nào bạn muốn thao tác trong IB.
Kanongata

Câu trả lời:


393

Trên thực tế, bạn có thể đặt một số thuộc tính của lớp của chế độ xem thông qua trình tạo giao diện. Tôi biết rằng tôi có thể đặt BorderWidth và angleRadius của một lớp thông qua xcode. BorderColor không hoạt động, có lẽ vì lớp này muốn CGColor thay vì UIColor.

Bạn có thể phải sử dụng Chuỗi thay vì số, nhưng nó hoạt động!

layer.cornerRadius
layer.borderWidth
layer.borderColor

Cập nhật: layer.masksToBound = true

thí dụ

Cập nhật: chọn Loại thích hợp cho Keypath:

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


3
Đối với bạn và Peter De Weese: Tôi sử dụng Xcode 4.6.3 và tôi có thể đặt loại đường khóa thành "Màu" mà không cần cài đặt giao diện CALayer

39
Thật không may layer.borderColor không thể được đặt theo cách này. Đó là CGColorRef, nhưng loại giá trị IB Color là UIColor.
mrgrieves

12
Vì vậy, đây là những gì người dùng xác định thuộc tính thời gian chạy làm! Haha, đã viết cho iOS từ năm 2011 và tôi chưa bao giờ biết những lĩnh vực đó dùng để làm gì. Cảm ơn câu trả lời tuyệt vời này.
Andy Ibanez

3
Đẹp, nhưng bạn phải đặt đúng loại cho mỗi tài sản. Loại ví dụ: "layer.cornerRadius" phải được đặt thành "Số" thay vì "Chuỗi"!
Peter Kreinz

5
Ngoài ra, đừng quên đánh dấu vào hộp kiểm "clip to bound" để angleRadius hoạt động.
Pierre-Olivier Simonard

182

Câu trả lời của Rich86Man là chính xác, nhưng bạn có thể sử dụng các danh mục cho các thuộc tính proxy như layer.borderColor. (Từ ConventionalC CocoaPod)

CALayer + XibConfiguration.h:

#import <QuartzCore/QuartzCore.h>
#import <UIKit/UIKit.h>

@interface CALayer(XibConfiguration)

// This assigns a CGColor to borderColor.
@property(nonatomic, assign) UIColor* borderUIColor;

@end

CALayer + XibConfiguration.m:

#import "CALayer+XibConfiguration.h"

@implementation CALayer(XibConfiguration)

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

-(UIColor*)borderUIColor
{
    return [UIColor colorWithCGColor:self.borderColor];
}

@end

Trình tạo giao diện

layer.borderUIColor

Kết quả sẽ rõ ràng trong thời gian chạy, không phải trong Xcode.

Chỉnh sửa : Bạn cũng cần thiết lậplayer.borderWidth ít nhất 1 để xem đường viền với màu đã chọn.

Trong Swift 2.0:

extension CALayer {
    var borderUIColor: UIColor {
        set {
            self.borderColor = newValue.CGColor
        }

        get {
            return UIColor(CGColor: self.borderColor!)
        }
    }
}

Trong Swift 3.0:

extension CALayer {
    var borderUIColor: UIColor {
        set {
            self.borderColor = newValue.cgColor
        }

        get {
            return UIColor(cgColor: self.borderColor!)
        }
    }
}

Tôi không thể làm điều này để làm việc cho tôi. Tệp .m rên rỉ về BorderColor phải là BorderUIColor và để sửa nó, sau khi thực hiện, nó vẫn hiển thị các cảnh báo và màu đường viền không hiển thị khi chạy. Điểm khác biệt của tôi là tôi có @ triển khai NameOfFile, không phải @ triển khai CALayer (NameOfFile), tôi không hiểu phần CALayer, bạn có thể giải thích thêm điều đó không
Dave Haigh

2
@PeterDeweese câu trả lời tuyệt vời! =)
nhân vật phản diện c

1
Bạn thực sự có thể sử dụng Số với BorderWidth và chấp nhận NSNumber. Nó hoạt động tốt.
Peter De Weese

1
Đây chắc chắn là giải pháp tốt nhất theo quan điểm của tôi để giải quyết vấn đề BorderColor. Sử dụng tuyệt vời của thể loại!
EricWasTaken 04/07/2015

1
Làm việc trong Swift!
KOTIOS

81

Câu trả lời tương tự với câu trả lời của iHulk, nhưng trong Swift

Thêm một tệp có tên UIView.swift trong dự án của bạn (hoặc chỉ dán tệp này vào bất kỳ tệp nào):

import UIKit

@IBDesignable extension UIView {
    @IBInspectable var borderColor: UIColor? {
        set {
            layer.borderColor = newValue?.cgColor
        }
        get {
            guard let color = layer.borderColor else {
                return nil
            }
            return UIColor(cgColor: color)
        }
    }
    @IBInspectable var borderWidth: CGFloat {
        set {
            layer.borderWidth = newValue
        }
        get {
            return layer.borderWidth
        }
    }
    @IBInspectable var cornerRadius: CGFloat {
        set {
            layer.cornerRadius = newValue
            clipsToBounds = newValue > 0
        }
        get {
            return layer.cornerRadius
        }
    }
}

Sau đó, tính năng này sẽ có sẵn trong Trình tạo giao diện cho mọi nút, imageView, nhãn, v.v. trong Bảng tiện ích> Trình theo dõi thuộc tính:

Thanh tra thuộc tính

Lưu ý: đường viền sẽ chỉ xuất hiện khi chạy.


@Gaurav Bạn thấy lỗi gì? Bạn đang sử dụng thành phần nào (UIButton, UILabel, v.v.)?
Axel Guilmin

Tôi không thể giúp bạn mà không có thêm chi tiết :(
Axel Guilmin

2
Tôi đã gặp sự cố Trình tạo giao diện với cách tiếp cận này cho đến khi tôi gỡ bỏ @IBDesignabletừ đầu tiện ích mở rộng.
Albert Bori

1
Thật tuyệt vời ... Cảm ơn! Tôi đang sử dụng XCode 8.2.1
bobwki

1
Rất tiện dụng và gọn gàng! Cảm ơn!
Karl-John Chow

56

Bạn có thể tạo một danh mục của UIView và thêm mục này vào tệp .h của danh mục

@property (nonatomic) IBInspectable UIColor *borderColor;
@property (nonatomic) IBInspectable CGFloat borderWidth;
@property (nonatomic) IBInspectable CGFloat cornerRadius;

Bây giờ thêm nó trong tập tin .m

@dynamic borderColor,borderWidth,cornerRadius;

và điều này cũng trong. tập tin m

-(void)setBorderColor:(UIColor *)borderColor{
    [self.layer setBorderColor:borderColor.CGColor];
}

-(void)setBorderWidth:(CGFloat)borderWidth{
    [self.layer setBorderWidth:borderWidth];
}

-(void)setCornerRadius:(CGFloat)cornerRadius{
    [self.layer setCornerRadius:cornerRadius];
}

bây giờ bạn sẽ thấy điều này trong bảng phân cảnh của mình cho tất cả các lớp con UIView (UILabel, UITextField, UIImageView, v.v.)

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

Đó là .. Không cần nhập thể loại ở bất cứ đâu, chỉ cần thêm các tệp của thể loại trong dự án và xem các thuộc tính này trong bảng phân cảnh.


2
Bổ sung nó với IB_DESIGNABLE để IB vẽ lại chế độ xem tùy chỉnh của bạn bằng cách sử dụng drawRect: method developer.apple.com/l
Library / ios / recipes / khăn

3
Thật tuyệt vời, Nếu bạn viết IB_DESIGNABLE trong tệp .h trước dòng giao diện, bạn không cần thêm dòng @dynamic trong .m
Jasmeet

@ user1618612 nó không liên quan gì đến độ phân giải, nó chỉ thiết lập các thuộc tính lớp bình thường.
iHulk

11

Đối với Swift 3 và 4 , nếu bạn sẵn sàng sử dụng IBInspectables, thì đây là:

@IBDesignable extension UIView {
    @IBInspectable var borderColor:UIColor? {
        set {
            layer.borderColor = newValue!.cgColor
        }
        get {
            if let color = layer.borderColor {
                return UIColor(cgColor: color)
            }
            else {
                return nil
            }
        }
    }
    @IBInspectable var borderWidth:CGFloat {
        set {
            layer.borderWidth = newValue
        }
        get {
            return layer.borderWidth
        }
    }
    @IBInspectable var cornerRadius:CGFloat {
        set {
            layer.cornerRadius = newValue
            clipsToBounds = newValue > 0
        }
        get {
            return layer.cornerRadius
        }
    }
}

Đây là một giải pháp tốt nhất cho tôi
Đội Đồng

Giải pháp tuyệt vời, Cảm ơn bạn
Ebtehal___

7

trong khi điều này có thể thiết lập các thuộc tính, nó không thực sự phản ánh trong IB. Vì vậy, nếu về cơ bản bạn đang viết mã bằng IB, thì bạn cũng có thể làm điều đó trong mã nguồn của mình


1
Chào mừng bạn đến với MVC! Bạn xem thuộc tính không bao giờ nên trong mã!
Alejandro Iván

2
^ Đây không phải là MVC.
Andrew Plummer

1
Xem xét rằng 95% thời gian mã này đi vào bộ điều khiển, nó cũng là MVC, tất nhiên bạn nên phân lớp đúng hoặc mở rộng chế độ xem của mình sau đó chỉ là cấu hình qua mã hóa :-)
Daniele Bernardini

4

Nếu bạn muốn tiết kiệm thời gian, chỉ cần sử dụng hai cái UIViewschồng lên nhau, cái ở phía sau là màu viền và cái ở phía trước nhỏ hơn, tạo hiệu ứng viền. Tôi cũng không nghĩ đây là một giải pháp tao nhã, nhưng nếu Apple quan tâm hơn một chút thì bạn không nên làm điều này.


10
Giải pháp tiết kiệm thời gian bây giờ và lãng phí nhiều thời gian hơn trong tương lai.
Lachezar Todorov

0

Nó hoàn toàn có thể chỉ khi bạn thiết lập layer.masksToBounds = truevà làm bạn nghỉ ngơi.


-1

Storyboard không hoạt động với tôi mọi lúc ngay cả sau khi thử tất cả các giải pháp ở đây

Vì vậy, nó luôn luôn là câu trả lời hoàn hảo khi sử dụng mã, Chỉ cần tạo phiên bản IBOutlet của UIView và thêm các thuộc tính

Câu trả lời ngắn :

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

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

Các góc tròn của UIView / UIButton, v.v.

customUIView.layer.cornerRadius = 10

Độ dày viền

pcustomUIView.layer.borderWidth = 2

Màu viền

customUIView.layer.borderColor = UIColor.blue.cgColor

Câu hỏi rất cụ thể và hỏi làm thế nào để làm điều đó từ Trình tạo giao diện. Câu trả lời của bạn là không liên quan.
Shinnyx

-5

Vui lòng thêm 2 dòng mã đơn giản sau:

self.YourViewName.layer.cornerRadius = 15
self.YourViewName.layer.masksToBounds = true

Nó sẽ hoạt động tốt.

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.