0

MiniView という UIView サブクラスを作成しました。

次のようにviewControllerに追加してみます:

@interface SomeViewController ()

@property (strong, nonatomic) MiniView *miniView;

@end

- (void)viewDidLoad
        {
        [super viewDidLoad];

        self.miniView = [[MiniView alloc] initWithFrame:CGRectMake(20.f, 20.f, 200.f, 200.f)];
        _miniView.backgroundColor = [UIColor blackColor];
        [self.view addSubview:_miniView];
    }

MiniView クラスは次のようになります。

- (id)initWithFrame:(CGRect)frame
{
    self = [super initWithFrame:frame];
    if (self) {
        // Initialization code
    }
    return self;
}

- (void)drawRect:(CGRect)rect
{
    NSLog(@"DRAW RECT");
    CGContextRef context = UIGraphicsGetCurrentContext();
    UIColor * redColor = [UIColor colorWithRed:1.0 green:0.0 blue:0.0 alpha:1.0];
    CGContextSetFillColorWithColor(context, redColor.CGColor);
    CGContextFillRect(context, self.bounds);
}

しかし、明示的に呼び出さない限り、setNeedsLayout メソッド内から drawRect が呼び出されることはありません。また、何も描画しません。drawRect メソッドに UIImageView を追加してみましたが、問題ないようです。しかし、上記のコードは何も生成しません。

エラーも表示されます:

: CGContextSetFillColorWithColor: 無効なコンテキスト 0x0。これは重大なエラーです。このアプリケーション、またはアプリケーションが使用するライブラリは無効なコンテキストを使用しているため、システムの安定性と信頼性が全体的に低下しています。この通知は厚意によるものです。この問題を修正してください。今後のアップデートで致命的なエラーになります。

drawRect メソッドでログ ステートメントを出力して 'rect' 値を出力すると、200 x 200 で正しいため、コンテキストが 0x0 である理由がわかりません。

したがって、1 つの問題は drawRect が呼び出されないことであり、もう 1 つの問題は、明示的に呼び出すと何も表示されないことです...

4

4 に答える 4

1

おそらくsetNeedsDisplay、カスタム UIView サブクラスを呼び出す必要があります。

- (void)viewDidLoad {
    [super viewDidLoad];

    self.miniView = [[MiniView alloc] initWithFrame:CGRectMake(20.f, 20.f, 200.f, 200.f)];
    _miniView.backgroundColor = [UIColor blackColor];
    [_miniView setNeedsDisplay];    // Added this
    [self.view addSubview:_miniView];
}

UIViewこれは基本的に、再描画する必要があることをシステムに伝えるための製品です。詳細については、ドキュメントを参照してください。

于 2013-10-28T15:51:34.937 に答える
1

要求に応じて別の回答として投稿する:

実際の問題はsetNeedsDisplay、次のように MiniView クラスでメソッドを再定義したことです。

- (void)setNeedsDisplay
{
    NSLog(@"Redrawing info: %@", [_info description]);
}

への呼び出しを怠っていたため[super setNeedsDisplay]、drawRect は呼び出されず、何も描画されませんでした。だからこれはそれを修正しました:

- (void)setNeedsDisplay
{
    [super setNeedsDisplay];
    NSLog(@"Redrawing info: %@", [_info description]);
}
于 2013-10-29T11:53:13.690 に答える
0

drawRect を明示的に呼び出さないでください。これを試してください。

- (void)viewDidLoad
        {
        [super viewDidLoad];

        self.miniView = [[MiniView alloc] initWithFrame:CGRectMake(20.f, 20.f, 200.f, 200.f)];
        _miniView.backgroundColor = [UIColor blackColor];
        [self.view addSubview:_miniView];

        [_miniView setNeedsDisplay];
    }
于 2013-10-28T15:43:12.673 に答える