0

drawRect画像を表示し、その上に動的に生成されたオーバーレイを配置するためにオーバーライドすると (コードを参照)、画像を拡大するたびに、スケーリングの結果として非常にぼやけた方法で描画されます。

画像は、png から描画された画像 (元のサイズは目的のサイズの 2 倍であるため、スケーリングしても問題はありませんが、問題は発生します) と、Rect のサイズに応じて動的に生成される画像の 2 つの部分で構成されているため、現在の四角形のサイズにも適応する必要がありますが、適応しません。

何か助けはありますか?

- (void) drawRect:(CGRect)rect
{
    CGContextRef ctx = UIGraphicsGetCurrentContext();

    CGContextDrawImage(ctx, CGRectMake(0, 0, rect.size.width, rect.size.height), [UIImage imageNamed:@"actionBg.png"].CGImage);

    // generate the overlay
    if ([self isActive] == NO && self.fullDelay != 0) { // TODO: remove fullDelay check!
        UIGraphicsBeginImageContextWithOptions(rect.size, NO, 0.0);
        CGContextRef overlayCtx = UIGraphicsGetCurrentContext();

        int segmentSize = (rect.size.height / [self fullDelay]);

        for (int i=0; i<[self fullDelay]; i++) {
            float alpha = 0.9 - (([self fullDelay] * 0.1) - (i * 0.1));
            [[UIColor colorWithRed:120.0/255.0 green:14.0/255.0 blue:14.0/255.0 alpha:alpha] setFill];

            if (currentDelay > i) {
                CGRect r = CGRectMake(0, i * segmentSize, rect.size.width, segmentSize);
                CGContextFillRect(overlayCtx, r);
            }
            [[UIColor colorWithRed:1 green:1 blue:1 alpha:0.3] setFill];
            CGRect line = CGRectMake(0, (i * segmentSize) + segmentSize - 1 , rect.size.width, 1);
            CGContextFillRect(overlayCtx, line);
        }

        UIImage *overlay = UIGraphicsGetImageFromCurrentImageContext();
        UIImage *overlayMasked = [TDUtilities maskImage:overlay withMask:[UIImage imageNamed:@"actionMask.png"]];

        // prevent the drawings to be flipped
        CGContextTranslateCTM(overlayCtx, 0, rect.size.height);
        CGContextScaleCTM(overlayCtx, 1.0, -1.0);

        CGContextSetBlendMode(ctx, kCGBlendModeMultiply);
        CGContextDrawImage(ctx, rect, overlayMasked.CGImage);
        CGContextSetBlendMode(ctx, kCGBlendModeNormal);

        UIGraphicsEndImageContext();
    }
4

1 に答える 1

0

問題は、縮尺を知らないoverlayMaskedCGImageとして描画していることです。CGContextDrawImageダブルスケールの状況では、手動でサイズを2倍にする必要があります。または、スケールを認識しているUIImageを使用する必要があります。

于 2012-11-29T02:39:04.573 に答える