【发布时间】:2023-03-15 17:30:01
【问题描述】:
是否可以直接从界面生成器控制 UIView 边框属性(颜色、厚度等),或者我只能通过编程来控制?
【问题讨论】:
-
以防万一有人像我一样来自 Google。要查看这些更改反映在 IB 中,您只需创建 UIView 的子类并将其分配给您想要在 IB 中操作的任何 View。
标签: ios uiview interface-builder border
是否可以直接从界面生成器控制 UIView 边框属性(颜色、厚度等),或者我只能通过编程来控制?
【问题讨论】:
标签: ios uiview interface-builder border
【讨论】:
Rich86Man 的回答是正确的,但是可以使用类别来代理layer.borderColor 等属性。 (来自ConventionalCCocoaPod)
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、标签等提供:
注意:边框只会在运行时出现。
【讨论】:
@IBDesignable 之前,我在使用这种方法时遇到了 Interface Builder 崩溃。
您可以创建一个 UIView 的类别并将其添加到类别的 .h 文件中
@property (nonatomic) IBInspectable UIColor *borderColor;
@property (nonatomic) IBInspectable CGFloat borderWidth;
@property (nonatomic) IBInspectable CGFloat cornerRadius;
现在将其添加到 .m 文件中
@dynamic borderColor,borderWidth,cornerRadius;
这也是在 . 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];
}
现在您将在所有 UIView 子类(UILabel、UITextField、UIImageView 等)的故事板中看到这一点
就是这样.. 无需在任何地方导入类别,只需在项目中添加类别的文件,然后在情节提要中查看这些属性。
【讨论】:
对于 Swift 3 和 4,如果你愿意使用IBInspectables,这里是:
@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 中编写代码,那么您不妨在源代码中编写代码
【讨论】:
如果你想节省时间,只需将两个UIViews叠加在一起,后面的一个是边框颜色,前面的一个较小,产生边框效果。我也不认为这是一个优雅的解决方案,但如果 Apple 更关心一点,那么您就不必这样做了。
【讨论】:
只有当你设置layer.masksToBounds = true 并且你休息时才可能。
【讨论】:
即使尝试了所有 解决办法在这里
所以使用代码总是完美的答案,只需创建 UIView 的 IBOutlet 实例并添加属性
简答:
layer.cornerRadius = 10
layer.borderWidth = 1
layer.borderColor = UIColor.blue.cgColor
长答案:
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
它会正常工作的。
【讨论】: