0

インターフェイス ビルダーで 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これも呼び出されていないことを確認できます。

4

1 に答える 1

0

わかりました、私は答えを見つけました。最初に、別のインスタンスをプログラムで追加しようとしましたが、元のインスタンスでは W+H に設定されているのに対し、自動サイズ変更マスクが none に設定されていることがわかりました。GPUImageViewこの手がかりにより、実際、インスタンスをサブビューとしてカスタム ビューに追加するのを忘れていたことに気付きました。私はそれを追加しました、そしてそれはうまくいきました。

于 2013-05-10T19:16:49.783 に答える