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?
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?
Câu trả lời:
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
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
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!)
}
}
}
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:
Lưu ý: đường viền sẽ chỉ xuất hiện khi chạy.
@IBDesignable
từ đầu tiện ích mở rộng.
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.)
Đó 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.
Đối với Swift 3 và 4 , nếu bạn sẵn sàng sử dụng IBInspectable
s, 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
}
}
}
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
Nếu bạn muốn tiết kiệm thời gian, chỉ cần sử dụng hai cái UIViews
chồ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.
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 :
customUIView.layer.cornerRadius = 10
pcustomUIView.layer.borderWidth = 2
customUIView.layer.borderColor = UIColor.blue.cgColor
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.