3

UITextViews テキストにストローク テキストを作成しようとしています。正常に動作していますが、テキストが画面に 2 回描画されています。これが UITextView のサブクラスの drawRect メソッドです...

- (void)drawRect:(CGRect)rect
{
    // Drawing code
    // Drawing code

    UIFont *font = [UIFont fontWithName:@"Cochin" size:[_fontSize floatValue]];

    CGContextRef context = UIGraphicsGetCurrentContext();
    CGContextSetShadow(context, CGSizeMake(1, 1), 1);
    CGContextSetRGBFillColor(context,1,1,1, 1);
    CGContextSetRGBStrokeColor(context, 0, 0, 0, 1);
    CGContextSetLineWidth(context, .35);
    CGContextSetTextDrawingMode(context, kCGTextFillStroke);
    CGContextSaveGState(context);
    [[self text] drawInRect:rect withFont:font];
}

clearsContextOnDraw を YES に設定しようとしましたが、うまくいきませんでした。助けてください...

4

4 に答える 4

3

私はちょうどあなたのコードを試してみましたが、うまくいきます。ただし、いくつかの注意事項があります。

  1. 「これはビューの無効な領域である」ことを意味するため、取得self.boundsするパラメーターではなく、描画するターゲット rect として使用する必要があります。rectこれはパフォーマンスの最適化であり、使用する必要はほとんどありません。

  2. 呼び出す必要はありませんCGContextSaveGState(呼び出した場合は、後で元に戻す必要があります)。通常は、現在のコンテキストを実際に変更する (そして後で復元する) サブルーチンを呼び出すときにこれを行いますが、理想的には、これをルーチン自体に移動する必要があります。

ビューの背景を白に設定し、フォントを大きくしてみてください。何が起こっているのかのヒントが得られるかもしれません。また、ここにスクリーンショットを投稿することもできます。

アップデート:

を使用していたことに気づきませんでしたUITextView。このクラスを使用してカスタム描画を行うべきではありません! 自分でテキストを描画したい場合は、サブクラス化してくださいUIView。を使用する場合は、のプロパティをUITextView使用します(たとえば、サブクラスで設定します。属性付き文字列の詳細は次のとおりです: Apple docsattributedStringUITextViewviewDidLoadUIViewController

于 2013-04-18T20:09:10.250 に答える
2

テキスト システムは、非常に多くの (ほとんどがプライベートな) クラス、メソッド、およびデータ構造からなる複雑な獣です。

パブリック クラスとして NSTextStorage、NSLayoutManager、NSTextContainer、および UITextView があります。適切な測定のために、UITextRange と UITextPosition をスローします。Mac OS X では、タイプセッター クラスもあります。

UITextView は NSLayoutManager に (drawRect の代わりにプライベート メソッドを介して) 特定の rect 領域にテキストを描画するように要求しますが、描画自体は実際には NSLayoutManager によって行われます。テキストを自分で描画したい場合は、独自の NSLayoutManager サブクラスを提供する必要があります。

最後の手段として NSLayoutManager サブクラスを使用してください。カスタム uiview を使用して自分でフレームとテキストを描画するか、uitextview を使用して、システムがテキストを描画していることを把握してみてください。そのためには NSLayoutManager メソッドが必要です。フレームを描画しますが、uitextview クラスの drawRect のテキストは描画しません。

于 2014-05-28T09:30:18.040 に答える
0

この問題を回避するためにこれを使用します

- (void)drawRect:(CGRect)rect{

    //YOUR Drawing code here ...

    self.textColor = [UIColor clearColor];
}
于 2015-06-15T08:48:18.253 に答える