【问题标题】:Is it possible to set UIView border properties from interface builder?是否可以从界面生成器设置 UIView 边框属性?
【发布时间】:2023-03-15 17:30:01
【问题描述】:

是否可以直接从界面生成器控制 UIView 边框属性(颜色、厚度等),或者我只能通过编程来控制?

【问题讨论】:

  • 以防万一有人像我一样来自 Google。要查看这些更改反映在 IB 中,您只需创建 UIView 的子类并将其分配给您想要在 IB 中操作的任何 View。

标签: ios uiview interface-builder border


【解决方案1】:

其实你可以通过interface builder来设置视图层的一些属性。我知道我可以通过xcode设置一个图层的borderWidth和cornerRadius。 borderColor 不起作用,可能是因为该层需要 CGColor 而不是 UIColor。

您可能必须使用字符串而不是数字,但它确实有效!

layer.cornerRadius
layer.borderWidth
layer.borderColor

更新: layer.masksToBounds = true

更新: 为 Keypath 选择适当的类型:

【讨论】:

  • 致你和 Peter DeWeese:我使用 Xcode 4.6.3,我可以在不实现 CALayer 界面的情况下将 keypath 类型设置为“Color”
  • 不幸的是 layer.borderColor 不能这样设置。它是 CGColorRef,但 IB 颜色值类型是 UIColor。
  • 所以这就是用户定义的运行时属性的作用!哈哈,自 2011 年以来一直在为 iOS 写作,但我从未了解这些领域的用途。感谢您的精彩回答。
  • 很好,但您必须为每个属性设置正确的类型。 e 的类型。 G。 “layer.cornerRadius”必须设置为“Number”而不是“String”!
  • 另外,不要忘记选中“clip to bounds”复选框以使cornerRadius正常工作。
【解决方案2】:

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!)
        }
    }
}

【讨论】:

  • 我无法让它为我工作。 .m 文件抱怨borderColor 必须是borderUIColor 并对其进行修复,这样做之后它仍然显示警告并且边框颜色不会在运行时呈现。我的不同之处在于我有@ implementation NameOfFile,而不是@ implementation CALayer(NameOfFile),我不明白 CALayer 部分,请你解释一下
  • @PeterDeWeese 很好的答案!=)
  • 您实际上可以将 Number 与 borderWidth 一起使用并接受 NSNumber。它工作正常。
  • 这绝对是我认为解决BorderColor问题的最佳解决方案。类别的奇妙使用!
  • 在 Swift 中工作!
【解决方案3】:

与 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、标签等提供:

注意:边框只会在运行时出现。

【讨论】:

  • @Gaurav 你看到了什么错误?您在哪个组件(UIButton、UILabel 等)上使用它?
  • 如果没有更多细节,我帮不了你:(
  • 在我从扩展的开头删除 @IBDesignable 之前,我在使用这种方法时遇到了 Interface Builder 崩溃。
  • 太棒了...谢谢!我正在使用 XCode 8.2.1
  • 非常方便和整洁!谢谢!
【解决方案4】:

您可以创建一个 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 等)的故事板中看到这一点

就是这样.. 无需在任何地方导入类别,只需在项目中添加类别的文件,然后在情节提要中查看这些属性。

【讨论】:

  • 用 IB_DESIGNABLE 补充它,让 IB 使用 drawRect: 方法重绘您的自定义视图:developer.apple.com/library/ios/recipes/…
  • 那太好了,如果在.h文件的interface行之前写IB_DESIGNABLE,就不需要在.m中添加@dynamic行
  • @user1618612 与分辨率无关,只是设置普通图层属性。
【解决方案5】:

对于 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
        }
    }
}

【讨论】:

  • 这对我来说是最好的解决方案
  • 很好的解决方案,谢谢你
【解决方案6】:

虽然这可能会设置属性,但它实际上并未反映在 IB 中。因此,如果您本质上是在 IB 中编写代码,那么您不妨在源代码中编写代码

【讨论】:

  • 欢迎来到 MVC!您的视图属性应该永远在代码中!
  • ^ 这不是 MVC。
  • 考虑到该代码 95% 的时间都在控制器中,它也是 MVC,当然如果您正确子类化或扩展您的视图,那么它只是配置而不是编码:-)
【解决方案7】:

如果你想节省时间,只需将两个UIViews叠加在一起,后面的一个是边框颜色,前面的一个较小,产生边框效果。我也不认为这是一个优雅的解决方案,但如果 Apple 更关心一点,那么您就不必这样做了。

【讨论】:

  • 变通办法现在可以节省时间,但将来会浪费更多时间。
【解决方案8】:

只有当你设置layer.masksToBounds = true 并且你休息时才可能。

【讨论】:

    【解决方案9】:

    即使尝试了所有 解决办法在这里

    所以使用代码总是完美的答案,只需创建 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
    

    【讨论】:

    • 这个问题非常具体,请问如何从 Interface Builder 中进行操作。你的回答无关紧要。
    【解决方案10】:

    请添加这 2 行简单的代码:

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

    它会正常工作的。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-07-20
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2017-01-06
      相关资源
      最近更新 更多