インターフェイス ビルダーで XIB ファイルを使用してカスタム ビュー コントローラーを設計しており、ビュー コントローラーに追加したいカスタム UIView サブクラスがあります。カスタムビューをView Controllerに配置する方法は次のとおりです。
私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];
になっていて、それが呼び出されることはありません。プログラムを実行すると、カスタム ビューが表示されず、タッチ イベントも受信されません (ただし、prepare メソッドは実行されます) 。get が呼び出されるため、インスタンスは正しいフレームで作成されます)。インターフェイスビルダーに入れられたことがないようなものです。これの原因は何ですか?これに関する多くの投稿を見てきましたが、ほとんどの場合、プログラムでビューを作成し、「initWithFrame:」の問題を示しています。しかし、私はその方法とは何の関係もありません。インターフェイス ビルダーと XIB の組み合わせを使用したいので、View Controller をプログラムで作成するようにアドバイスしないでください。その原因は何ですか?
ありがとう、
できる。
更新:-(void)drawLayer:(CALayer *)layer inContext:(CGContextRef)ctx
これも呼び出されていないことを確認できます。