20

そのため、UIScrolLViewでdrawRectをオーバーライドしようとしていますが、UIScrollViewに指定した背景色ではなく、この黒い背景が表示されます。どうしてこれなの?drawRectコードを削除すると、すべて問題ありません。

- (void)drawRect:(CGRect)rect
{
    [super drawRect:rect];
    if (shouldDrawVerticalLineForProfile){

        CGContextRef context = UIGraphicsGetCurrentContext();
        CGColorRef separatorColor = [UIColor colorWithRed:47.0/255.0 green:47.0/255.0 
                                                     blue:47.0/255.0 alpha:1.0].CGColor;

        // Add at bottom
        CGPoint startPoint = CGPointMake(60, 0);
        CGPoint endPoint = CGPointMake(60, 10000);

        CGContextSaveGState(context);
        CGContextSetLineCap(context, kCGLineCapSquare);
        CGContextSetStrokeColorWithColor(context, separatorColor);
        CGContextSetLineWidth(context, 5.0);
        CGContextMoveToPoint(context, startPoint.x + 0.5, startPoint.y + 0.5);
        CGContextAddLineToPoint(context, endPoint.x + 0.5, endPoint.y + 0.5);
        CGContextStrokePath(context);
        CGContextRestoreGState(context);  

    }

}
4

6 に答える 6

23

あなたが探しているのは次のとおりだと思います:

myScrollViewInstance.opaque = NO

その後、スクロール ビューの背景が黒くならなくなります。

于 2013-04-04T14:13:08.437 に答える
14

UIScrollView サブクラスで drawRect をオーバーライドすると、同様の状況に遭遇しました。

単純にオーバーライドする:

- (void)drawRect:(CGRect)rect
{
    [super drawRect:rect];
}

オーバーライドせずに取得したいクリアな背景ではなく、黒い背景になりました。

View Background が Interface Builder で Default に設定されており、その設定で問題が解決したことが原因であることがわかりましたClear Color

これがあなたの問題に関連しているかどうかはわかりませんが、役立つ場合に備えて共有したいと思います.

于 2013-10-28T19:38:03.830 に答える
8

ここでの答えは、UIView のdrawRect:メソッドの AppleDocs に非常に明確に文書化されています。最初の文は次のとおりです。

このメソッドのデフォルトの実装は何もしません。

したがって、super を呼び出すというここでの提案は役に立ちません。残りの回答は、ディスカッションのさらに下に含まれています。

... ビューの opaque プロパティが YES に設定されている場合、 drawRect: メソッドは、指定された長方形を不透明なコンテンツで完全に埋める必要があります。

つまり、背景を透明にするつもりがない場合は、実際に背景を描画する必要があります。これを行う最も正しい方法は、次のdrawRect:テンプレートを使用することです。

- (void)drawRect:(CGRect)rect
{
    [super drawRect:rect]; // optional if a direct UIView-subclass, should be called otherwise.

    CGContextRef context = UIGraphicsGetCurrentContext();
    // Fill the background color, if needed
    if (self.opaque) {
        UIGraphicsPushContext(context);
        CGContextSetFillColorWithColor(context, self.backgroundColor.CGColor);
        CGContextFillRect(context, rect);
        UIGraphicsPopContext();
    }

    // Your code here...
}
于 2015-12-22T17:29:12.013 に答える
4

これは役立つはずです

CGContextSetFillColorWithColor(context, colorBack);
CGContextFillRect(context, self.bounds); 

// 境界を選択し、それに応じて colorBack

于 2012-07-03T21:32:09.850 に答える
-1

私にとってうまくいった唯一のことは、への呼び出しの後に背景を明示的に設定することでしたsetNeedsDisplay。私の例ではMKAnnotationView、 の代わりにマップ上の のサブクラスを使用していたので、これが OP シナリオにどの程度当てはまるかはよくわかりUIScrollViewません私の場合、setNeedsDisplayから呼び出しsetAnnotationていましたが、そうすると によってリセットされることがわかりましたbackgroundColor。問題を修正したbackgroundColor後、再設定するだけです。setNeedsDisplay

drawRectFWIW、スーパークラスに委任するようにオーバーライドするだけで、この黒い背景の問題が発生することもわかりました。

于 2014-01-14T03:00:40.567 に答える