IBInspectable 与枚举

作者: MacLeon | 来源:发表于2019-03-30 12:21 被阅读0次

在使用IBInspectable定义可视化属性时,对于枚举类型,是没法在xib上可视化的。代码如下:


#import <Cocoa/Cocoa.h>

NS_ASSUME_NONNULL_BEGIN
typedef enum : NSUInteger {
    EMBorderViewTypeNone,
    EMBorderViewTypeDash,  ///< 虚线边界线
    EMBorderViewTypeSolid,  ///< 实线边界线
} EMBorderLineType;

typedef NS_OPTIONS(NSUInteger, EMBorderMode) {
    EMBorderModeNone   = 1 << 0,  ///< 没有边界线
    EMBorderModeLeft   = 1 << 1,  ///< 有左边界线
    EMBorderModeRight  = 1 << 2,  ///< 有右边界线
    EMBorderModeTop    = 1 << 3,  ///< 有上边界线
    EMBorderModeBottom = 1 << 4,  ///< 有下边界线
    EMBorderModeAll    = 1 << 5,  ///< 有全部边界线
};

IB_DESIGNABLE

@interface EMBorderView : NSView
@property (nonatomic,strong) IBInspectable NSColor *lineColor;
@property (nonatomic, assign) IBInspectable EMBorderLineType borderLineType;  ///< 边界线类型,对应EMBorderLineType枚举值
@property (nonatomic, assign) IBInspectable EMBorderMode borderMode; ///< 边界线模式,对应EMBorderMode枚举值
@property (nonatomic, assign) IBInspectable CGFloat lineWidth; ///< 线宽

- (instancetype)initWithLineType:(EMBorderLineType)lineType mode:(EMBorderMode)mode;

@end

NS_ASSUME_NONNULL_END

这段代码中,只有lineColor、lineWidth是可以可视化的:

clip_6.png

而2个枚举属性borderLineType和borderMode无法在属性监视器上显示。
查了下资料,对于IBInspectable关键字支持的属性类型,发现它仅支持以下几种基础数据类型的属性:

Int
CGFloat
Double
String
Bool
CGPoint
CGSize
CGRect
UIColor
NSColor
UIImage
NSImage

我们知道枚举本质也就是NSIngeger或NSUInteger,所以为了让这2个枚举属性可视化,我们可以将属性这样定义:

@property (nonatomic, assign) IBInspectable NSUInteger borderLineType;  ///< 边界线类型,对应EMBorderLineType枚举值
@property (nonatomic, assign) IBInspectable NSUInteger borderMode; ///< 边界线模式,对应EMBorderMode枚举值

同时注意setter方法中也需要将其类型改为NSUInteger,如:

- (void)setBorderMode:(NSUInteger)borderMode {
    if (_borderMode == borderMode) {
        return;
    }
    _borderMode = borderMode;
    [self refresh];
}

这样我们就能在属性监视器上看到我们定义的属性:


image.png

当然,这个方法的缺点就是,在属性监视器中设置枚举类型属性时,要自己对所需的枚举值做运算。这或许不是最好的方法,如果大家有什么更好的方法来优雅的使用IBInspectable定义可视化属性,欢迎大家讨论不吝赐教~

参考链接:

@IBInspectable with enum?

相关文章

  • IBInspectable 与枚举

    在使用IBInspectable定义可视化属性时,对于枚举类型,是没法在xib上可视化的。代码如下: 这段代码中,...

  • @IBDesignable、@IBInspectable

    @IBInspectable 标有 @IBInspectable(或是 Objective-C 中的 IBInsp...

  • Python入门与进阶(11-3)

    11-3 枚举类型、枚举名称与枚举值

  • IB_DESIGNABLE和IBInspectable的使用

    IB_DESIGNABLE和IBInspectable

  • 10、枚举与闭包

    枚举 枚举和普通类相比有什么优势 枚举类型、枚举名称与枚举值 枚举的比较运算 两个枚举之间可以使用等值比较(==)...

  • Python枚举

    1. 枚举类型、枚举名称与枚举值 枚举优点: 不可更改性, 不可重复性 2. 枚举比较 枚举只能进行等于比较不能进...

  • 枚举

    枚举 本节内容包括: 枚举语法 匹配枚举值与switch语句 相关值 原始值 枚举语法 注意:不像 C 和 Obj...

  • 在学习swift的一些笔记(七)

    OC与Swift中的枚举 OC的枚举NS_ENUM NS_ENUM : 递增枚举, 每个枚举类型即便不是每个都赋值...

  • iOS的UI 进阶(Swift),UI -> IB: @I

    iOS的UI 进阶(Swift),UI -> IB: @IBDesignable, @IBInspectable

  • Swift-07:枚举enum

    这里先介绍一下swift枚举与oc枚举的区别 OC: 枚举只能为Int类型swift : 可以在枚举中定义方法 可...

网友评论

    本文标题:IBInspectable 与枚举

    本文链接:https://www.haomeiwen.com/subject/ebujbqtx.html