用 IB_DESIGNABLE obj-c 扩展 class
extend class with IB_DESIGNABLE obj-c
我发现 IBDesignable
和 IBInspectable
非常有用,可以直接将 setter 可能性带到情节提要中。
我以这种方式在 swift 项目中使用它
import Foundation
import UIKit
@IBDesignable extension UIView {
@IBInspectable var addBorderTop: CGFloat {
set {
addBorderUtility(0, y: 0, width: frame.width, height: newValue, color: layer.borderColor)
}
get {
return 0
}
}
@IBInspectable var addBorderBottom: CGFloat {
set {
addBorderUtility(0, y: frame.height - newValue, width: frame.width, height: newValue, color: layer.borderColor)
}
get {
return 0
}
}
@IBInspectable var addBorderLeft: CGFloat {
set {
addBorderUtility(0, y: 0, width: newValue, height: frame.height, color: layer.borderColor)
}
get {
return 0
}
}
@IBInspectable var addBorderRight: CGFloat {
set {
addBorderUtility(frame.width - newValue, y: 0, width: newValue, height: frame.height, color: layer.borderColor)
}
get {
return 0
}
}
private func addBorderUtility(_ x: CGFloat, y: CGFloat, width: CGFloat, height: CGFloat, color: CGColor?) {
let border = CALayer()
border.backgroundColor = color
border.frame = CGRect(x: x, y: y, width: width, height: height)
layer.addSublayer(border)
}
}
这就像一个魅力。所以我决定在 objective-c 项目上做同样的事情,在这里尝试扩展 UIView 是 hhow 它看起来像
UIView+Border.h
#import <UIKit/UIKit.h>
@interface UIView ()
@property (nonatomic) IBInspectale CGFloat addBorderTop;
@property (nonatomic) IBInspectale CGFloat addBorderBottom;
@property (nonatomic) IBInspectale CGFloat addBorderLeft;
@property (nonatomic) IBInspectale CGFloat addBorderRight;
@end
UIView+Border.m
#import "UIView+Border.h"
@interface UIView ()
IB_DESIGNABLE
@implementation UIView ()
- (void) setAddBorderTop: (CGFloat) newValue
{
addBorderUtility(0, y: 0, width: frame.width, height: newValue, color: layer.borderColor)
}
- (void) setAddBorderBottom: (CGFloat) newValue
{
addBorderUtility(0, y: frame.height - newValue, width: frame.width, height: newValue, color: layer.borderColor)
}
- (void) setAddBorderLeft: (CGFloat) newValue
{
addBorderUtility(0, y: 0, width: newValue, height: frame.height, color: layer.borderColor)
}
- (void) setAddBorderRight: (CGFloat) newValue
{
addBorderUtility(frame.width - newValue, y: 0, width: newValue, height: frame.height, color: layer.borderColor)
}
- (void) addBorderUtility: (CGFloat):x y:(CGFloat)y width:(CGFloat)width height:(CGFloat)height color:(CGColor)color
{
CALayer *border = [CALayer init]
border.backgroundColor = color
border.frame = CGRect(x: x, y: y, width: width, height: height)
layer.addSublayer(border)
}
@end
但是 none 我的自定义变量可以从故事板上的右侧菜单中设置。我还尝试添加一个与我的客户变量同名的 User Defined Runtime Attributes
,一旦你 运行 应用程序就没有任何反应。
知道怎么做吗?谢谢
您没有正确定义类别。您需要指定类别名称,否则编译器会将其解释为 UIView
的重新声明。试试 @interface UIView (Design)
和 @implementation UIView (Design)
.
你的代码有很多错误Objective-C,我已经更新了。
您必须使用 CALayer *border = [CALayer layer];
而不是 CALayer *border = [CALayer init];
。
请检查此代码:
UIView+Border.h
#import <UIKit/UIKit.h>
@interface UIView (Border)
@property (nonatomic) IBInspectable CGFloat addBorderTop;
@property (nonatomic) IBInspectable CGFloat addBorderBottom;
@property (nonatomic) IBInspectable CGFloat addBorderLeft;
@property (nonatomic) IBInspectable CGFloat addBorderRight;
@end
UIView+Border.m
#import "UIView+Border.h"
IB_DESIGNABLE
@implementation UIView (Border)
@dynamic addBorderTop;
@dynamic addBorderBottom;
@dynamic addBorderLeft;
@dynamic addBorderRight;
- (void) setAddBorderTop: (CGFloat)newValue
{
[self addBorderUtility:0 y:0 width:self.frame.size.width height:newValue color:self.layer.borderColor];
}
- (void) setAddBorderBottom: (CGFloat) newValue
{
[self addBorderUtility:0 y:self.frame.size.height - newValue width:self.frame.size.width height:newValue color:self.layer.borderColor];
}
- (void) setAddBorderLeft: (CGFloat) newValue
{
[self addBorderUtility:0 y:0 width:newValue height:self.frame.size.height color:self.layer.borderColor];
}
- (void) setAddBorderRight: (CGFloat) newValue
{
[self addBorderUtility:self.frame.size.width - newValue y:0 width:newValue height:self.frame.size.height color:self.layer.borderColor];
}
- (void) addBorderUtility:(CGFloat)x y:(CGFloat)y width:(CGFloat)width height:(CGFloat)height color:(CGColorRef)color
{
CALayer *border = [CALayer layer];
border.backgroundColor = color;
border.frame = CGRectMake(x, y, width, height);
[self.layer addSublayer:border];
}
@end
我发现 IBDesignable
和 IBInspectable
非常有用,可以直接将 setter 可能性带到情节提要中。
我以这种方式在 swift 项目中使用它
import Foundation
import UIKit
@IBDesignable extension UIView {
@IBInspectable var addBorderTop: CGFloat {
set {
addBorderUtility(0, y: 0, width: frame.width, height: newValue, color: layer.borderColor)
}
get {
return 0
}
}
@IBInspectable var addBorderBottom: CGFloat {
set {
addBorderUtility(0, y: frame.height - newValue, width: frame.width, height: newValue, color: layer.borderColor)
}
get {
return 0
}
}
@IBInspectable var addBorderLeft: CGFloat {
set {
addBorderUtility(0, y: 0, width: newValue, height: frame.height, color: layer.borderColor)
}
get {
return 0
}
}
@IBInspectable var addBorderRight: CGFloat {
set {
addBorderUtility(frame.width - newValue, y: 0, width: newValue, height: frame.height, color: layer.borderColor)
}
get {
return 0
}
}
private func addBorderUtility(_ x: CGFloat, y: CGFloat, width: CGFloat, height: CGFloat, color: CGColor?) {
let border = CALayer()
border.backgroundColor = color
border.frame = CGRect(x: x, y: y, width: width, height: height)
layer.addSublayer(border)
}
}
这就像一个魅力。所以我决定在 objective-c 项目上做同样的事情,在这里尝试扩展 UIView 是 hhow 它看起来像
UIView+Border.h
#import <UIKit/UIKit.h>
@interface UIView ()
@property (nonatomic) IBInspectale CGFloat addBorderTop;
@property (nonatomic) IBInspectale CGFloat addBorderBottom;
@property (nonatomic) IBInspectale CGFloat addBorderLeft;
@property (nonatomic) IBInspectale CGFloat addBorderRight;
@end
UIView+Border.m
#import "UIView+Border.h"
@interface UIView ()
IB_DESIGNABLE
@implementation UIView ()
- (void) setAddBorderTop: (CGFloat) newValue
{
addBorderUtility(0, y: 0, width: frame.width, height: newValue, color: layer.borderColor)
}
- (void) setAddBorderBottom: (CGFloat) newValue
{
addBorderUtility(0, y: frame.height - newValue, width: frame.width, height: newValue, color: layer.borderColor)
}
- (void) setAddBorderLeft: (CGFloat) newValue
{
addBorderUtility(0, y: 0, width: newValue, height: frame.height, color: layer.borderColor)
}
- (void) setAddBorderRight: (CGFloat) newValue
{
addBorderUtility(frame.width - newValue, y: 0, width: newValue, height: frame.height, color: layer.borderColor)
}
- (void) addBorderUtility: (CGFloat):x y:(CGFloat)y width:(CGFloat)width height:(CGFloat)height color:(CGColor)color
{
CALayer *border = [CALayer init]
border.backgroundColor = color
border.frame = CGRect(x: x, y: y, width: width, height: height)
layer.addSublayer(border)
}
@end
但是 none 我的自定义变量可以从故事板上的右侧菜单中设置。我还尝试添加一个与我的客户变量同名的 User Defined Runtime Attributes
,一旦你 运行 应用程序就没有任何反应。
知道怎么做吗?谢谢
您没有正确定义类别。您需要指定类别名称,否则编译器会将其解释为 UIView
的重新声明。试试 @interface UIView (Design)
和 @implementation UIView (Design)
.
你的代码有很多错误Objective-C,我已经更新了。
您必须使用 CALayer *border = [CALayer layer];
而不是 CALayer *border = [CALayer init];
。
请检查此代码:
UIView+Border.h
#import <UIKit/UIKit.h>
@interface UIView (Border)
@property (nonatomic) IBInspectable CGFloat addBorderTop;
@property (nonatomic) IBInspectable CGFloat addBorderBottom;
@property (nonatomic) IBInspectable CGFloat addBorderLeft;
@property (nonatomic) IBInspectable CGFloat addBorderRight;
@end
UIView+Border.m
#import "UIView+Border.h"
IB_DESIGNABLE
@implementation UIView (Border)
@dynamic addBorderTop;
@dynamic addBorderBottom;
@dynamic addBorderLeft;
@dynamic addBorderRight;
- (void) setAddBorderTop: (CGFloat)newValue
{
[self addBorderUtility:0 y:0 width:self.frame.size.width height:newValue color:self.layer.borderColor];
}
- (void) setAddBorderBottom: (CGFloat) newValue
{
[self addBorderUtility:0 y:self.frame.size.height - newValue width:self.frame.size.width height:newValue color:self.layer.borderColor];
}
- (void) setAddBorderLeft: (CGFloat) newValue
{
[self addBorderUtility:0 y:0 width:newValue height:self.frame.size.height color:self.layer.borderColor];
}
- (void) setAddBorderRight: (CGFloat) newValue
{
[self addBorderUtility:self.frame.size.width - newValue y:0 width:newValue height:self.frame.size.height color:self.layer.borderColor];
}
- (void) addBorderUtility:(CGFloat)x y:(CGFloat)y width:(CGFloat)width height:(CGFloat)height color:(CGColorRef)color
{
CALayer *border = [CALayer layer];
border.backgroundColor = color;
border.frame = CGRectMake(x, y, width, height);
[self.layer addSublayer:border];
}
@end