我有一个UIControl从xib文件加载它的UI。我把它更新为IB_DESIGNABLE。我在组件用于另一个xib或storyboard时加载它的UI的能力之一。
#if TARGET_INTERFACE_BUILDER
-(instancetype) initWithFrame:(CGRect)frame {
self = [self loadFromXib];
return self;
}
#endif
-(id) awakeAfterUsingCoder:(NSCoder *)aDecoder {
if ([self.subviews count] == 0) {
return [self loadFromXib];
}
return self;
}
-(id) loadFromXib {
UIControl *realControl = nil;
Class thisClass = [self class];
for (id obj in [[NSBundle bundleForClass:thisClass] loadNibNamed:NSStringFromClass(thisClass)
owner:nil // This must be nil or we get into a loop.
options:nil]) {
if ([obj isKindOfClass:thisClass]) {
realControl = obj;
break;
}
}
NSAssert(realControl != nil, @"Failed to find an object of type %@ in the xib file.", NSStringFromClass(thisClass));
// copy control frame and settings here ....
return realControl;
}
这很有效,在查看故事板和运行应用程序时加载UI。
然而,当我为控件本身编辑xib时,IB会激活此代码并在IB中自行绘制控件。因此我看到它两次:
在这种情况下,您可以看到右侧的标签,即控件的UILabel子视图,以及在UIImage下面绘制的“标签”一词,如果没有图像,它就是这样。这是加载IB预览并绘制控件的位置。
从目前为止我能够弄清楚有两种方法可以让预览发生。首先是在运行应用程序时,其次是在IB中显示控件时。
在这里,我正在寻找第三个选项,即能够说,在IB中绘制,但不能在编辑控件本身时,只有在使用它时渲染控件时。
有没有人想出如何做到这一点?