是否可以直接从界面生成器控制 UIView 边框属性(颜色、厚度等),或者我只能以编程方式进行控制?
9 回答
Rich86Man 的回答是正确的,但是可以使用类别来代理layer.borderColor 等属性。(来自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
结果将在运行时显示,而不是在 Xcode 中。
编辑:您还需要设置layer.borderWidth
为至少 1 才能看到所选颜色的边框。
在 Swift 2.0 中:
extension CALayer {
var borderUIColor: UIColor {
set {
self.borderColor = newValue.CGColor
}
get {
return UIColor(CGColor: self.borderColor!)
}
}
}
在 Swift 3.0 中:
extension CALayer {
var borderUIColor: UIColor {
set {
self.borderColor = newValue.cgColor
}
get {
return UIColor(cgColor: self.borderColor!)
}
}
}
与 iHulk 类似的答案,但在 Swift 中
在您的项目中添加一个名为 UIView.swift 的文件(或将其粘贴到任何文件中):
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
}
}
}
然后,这将在 Interface Builder 中为 Utilities Panel > Attributes Inspector 中的每个按钮、imageView、标签等提供:
注意:边框只会在运行时出现。
您可以创建一个 UIView 类别并将其添加到类别的 .h 文件中
@property (nonatomic) IBInspectable UIColor *borderColor;
@property (nonatomic) IBInspectable CGFloat borderWidth;
@property (nonatomic) IBInspectable CGFloat cornerRadius;
现在将其添加到 .m 文件中
@dynamic borderColor,borderWidth,cornerRadius;
这也是在 . 文件
-(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];
}
现在您将在故事板中看到所有 UIView 子类(UILabel、UITextField、UIImageView 等)的这一点
就是这样.. 无需在任何地方导入类别,只需在项目中添加类别的文件并在情节提要中查看这些属性。
对于Swift 3 和 4,如果你愿意使用IBInspectable
s,有这个:
@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
}
}
}
虽然这可能会设置属性,但它实际上并没有反映在 IB 中。因此,如果您本质上是在 IB 中编写代码,那么您不妨在源代码中进行
layer.masksToBounds = true
只有当您设置并休息时,它才是绝对可能的。
即使在这里尝试了所有解决方案之后,故事板也不总是对我有用
所以总是完美的答案是使用代码,只需创建 UIView 的 IBOutlet 实例并添加属性
简短的回答:
layer.cornerRadius = 10
layer.borderWidth = 1
layer.borderColor = UIColor.blue.cgColor
长答案:
UIView/UIButton等的圆角
customUIView.layer.cornerRadius = 10
边框厚度
pcustomUIView.layer.borderWidth = 2
边框颜色
customUIView.layer.borderColor = UIColor.blue.cgColor
请添加这 2 行简单的代码:
self.YourViewName.layer.cornerRadius = 15
self.YourViewName.layer.masksToBounds = true
它会正常工作。