XIB 中的 UIView 子类不显示(drawRect:从未调用)

Posted

技术标签:

【中文标题】XIB 中的 UIView 子类不显示(drawRect:从未调用)【英文标题】:UIView subclass in XIB doesn't display (drawRect: never called) 【发布时间】:2013-05-10 18:51:33 【问题描述】:

我正在使用 XIB 文件在界面构建器中设计一个自定义视图控制器,并且我有一个自定义 UIView 子类,我想将它添加到我的视图控制器中。以下是我将自定义视图放入视图控制器的方式:

我的TonerEffectButtonView 类是UIView 的子类(与UIButton 无关),这是我的代码:

- (id)initWithFrame:(CGRect)frame

    self = [super initWithFrame:frame];
    if (self) 
        // Initialization code
    
    return self;



-(void)prepareWithSelector:(SEL)selector onTarget:(id)targ withFilter:(GPUImageFilter*)filter
    self.gpuImageView = [[GPUImageView alloc] initWithFrame:self.frame];
    UITapGestureRecognizer *gesture = [[UITapGestureRecognizer alloc] initWithTarget:targ action:selector];
    [self addGestureRecognizer:gesture];
    selectedFilter = filter;
    [filter addTarget:self.gpuImageView];
    [self setNeedsDisplay];


- (void)drawRect:(CGRect)rect

    [super drawRect:rect];


initWithFrame: 无论如何都不会被调用,因为我正在通过 XIB 创建视图,并且我不需要在 initWithCoder: 中进行任何自定义,所以我没有实现它。我有一个GPUImageView(这是我正在使用的库的一部分),我正在我的视图中以编程方式创建它,并向它添加相机输入(如果你问准备方法中发生了什么)。 Prepare 方法是从外部调用的,我已经验证了 UIView 的框架是正确的。我在[super drawRect:rect]; 上有一个断点,它永远不会被调用,当我运行程序时,我的自定义视图不会显示,也不会接收触摸事件(但准备方法 DOES 会被调用,因此实例是用正确的框架创建的)。就好像它从未放在界面生成器中一样。这可能是什么原因?我看过很多关于这个的帖子,它们主要是指以编程方式创建视图并指出“initWithFrame:”的问题。但我与该方法无关,我想使用界面生成器/XIB 对,请不要建议我以编程方式创建视图控制器。可能是什么原因造成的?

谢谢,

可以。

更新:我可以验证-(void)drawLayer:(CALayer *)layer inContext:(CGContextRef)ctx 也没有以任何方式被调用。

【问题讨论】:

【参考方案1】:

好的,我找到了答案。首先,我尝试以编程方式添加另一个实例,我发现它的自动调整掩码设置为无,而我的原始实例将其设置为 W+H。这个线索让我意识到,事实上,我忘记将我的GPUImageView 实例作为子视图添加到我的自定义视图中。我已经添加了它,它确实有效。

【讨论】:

以上是关于XIB 中的 UIView 子类不显示(drawRect:从未调用)的主要内容,如果未能解决你的问题,请参考以下文章

跨多个 UIView 子类的单个 drawRect 实现

带有 Xib 文件的 UIView 的子类

从 xib 加载子类时如何设置子类 UIView 属性的值

UIView:从自定义 XIB 加载导致崩溃

如何初始化从 xib 加载的 UIView 子类?继承问题

在自包含的自定义 UIView 子类中使用 .xib 文件进行原型设计