我正在使用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];
}
因为我正在通过XIB创建视图,所以 initWithFrame:
没有被调用,我在initWithCoder:
中不需要任何自定义,所以我没有实现它。我有一个GPUImageView
(这是我正在使用的库的一部分),我正在我的视图中以编程方式创建,并向其添加摄像头输入(如果您询问prepare方法中发生了什么)。准备方法是从外部调用的,我已经验证了我的UIView的框架是正确的。我在[super drawRect:rect];
上有一个断点,它永远不会被调用,当我运行程序时,我的自定义视图没有显示,也没有接收到触摸事件(但是准备方法 DOES 被调用,所以使用正确的框架创建实例)。就像它从未在界面构建器中放在那里一样。可能是什么原因造成的?我已经看过很多关于这个的帖子,他们主要是指以编程方式创建视图并指出'initWithFrame:'的问题。但我与该方法无关,我想使用界面构建器/ XIB对,请不要建议我以编程方式创建视图控制器。可能是什么原因?
谢谢,
可以。
更新:我可以验证是否也未以任何方式调用-(void)drawLayer:(CALayer *)layer inContext:(CGContextRef)ctx
。
答案 0 :(得分:0)
好的,我找到了答案。首先,我尝试以编程方式添加另一个实例,并且我发现它将autoresizing mask设置为none,而我的原始实例将其设置为W + H.这条线索让我意识到,事实上,我忘记将我的GPUImageView
实例作为子视图添加到我的自定义视图中。我添加了它,并且它有效。