编辑关联的xib文件时绘制的Objective C组件的IB_DESIGNABLE

时间:2014-12-17 02:31:16

标签: ios interface-builder xib

我有一个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中自行绘制控件。因此我看到它两次:

enter image description here

在这种情况下,您可以看到右侧的标签,即控件的UILabel子视图,以及在UIImage下面绘制的“标签”一词,如果没有图像,它就是这样。这是加载IB预览并绘制控件的位置。

从目前为止我能够弄清楚有两种方法可以让预览发生。首先是在运行应用程序时,其次是在IB中显示控件时。

在这里,我正在寻找第三个选项,即能够说,在IB中绘制,但不能在编辑控件本身时,只有在使用它时渲染控件时。

有没有人想出如何做到这一点?

0 个答案:

没有答案