gpt4 book ai didi

iphone - 设置需要显示矩形 : paints a white rectangle only

转载 作者:行者123 更新时间:2023-12-03 19:47:13 24 4
gpt4 key购买 nike

我对 CoreGraphics 编程还很陌生,所以请耐心等待。我正在尝试编写一个应用程序,它允许用户用手指擦掉图像上的东西。我已经确定了基本功能,但结果很慢,因为每次渲染触摸时屏幕都会完全重绘。我做了一些研究,发现使用 UIView 的 setNeedsDisplayInRect: 方法只能刷新屏幕的一部分。

这确实按预期调用了drawRect:,但是我在setNeedsDisplayInRect:之后的drawRect:中绘制的所有内容都被忽略。相反,矩形参数中的区域只是用白色填充。无论我在里面画什么,最终得到的都是一个白色矩形。

本质上,这就是我所做的:

1) 当用户触摸屏幕时,此触摸会渲染为 mask 2) 当调用drawRect:时,图像被该掩码遮蔽

一定有一些简单的事情我忽略了,肯定吗?

最佳答案

我找到了一个解决方案,但我仍然不知道它到底是如何工作的。代码如下:

该方法以相同的方式翻转给定的矩形,其中上下文中的坐标变换翻转上下文坐标系:

- (CGRect) flippedRect:(CGRect)rect
{
CGRect flippedRect = rect;

flippedRect.origin.y = self.bounds.size.height - rect.origin.y - rect.size.height;

return CGRectIntersection( self.bounds, flippedRect );
}

这将计算要从触摸位置更新的矩形。请注意,矩形被翻转:

- (CGRect) updateRectFromTouch:(UITouch *)touch
{
CGPoint location = [touch locationInView:self];

int d = RubbingSize;

CGRect touchRect = [self flippedRect:CGRectMake( location.x - d, location.y - d, 2*d, 2*d )];

return CGRectIntersection( self.frame, touchRect );
}

在渲染触摸中,强制“翻转”更新矩形:

- (void) renderTouch:(UITouch *)touch
{
//
// Code to render into the mask here
//

if ( m_updateRect.size.width == 0 )
{
m_updateRect = [self updateRectFromTouch:touch];
}
else
{
m_updateRect = CGRectUnion( m_updateRect, [self updateRectFromTouch:touch] );
}
}

指画过程中整个 View 刷新频率约为20Hz。以下方法每 1/20 秒调用一次并提交矩形进行渲染:

- (void) refreshScreen
{
if ( m_updateRect.size.width > 0 )
{
[self setNeedsDisplayInRect:[self flippedRect:m_updateRect]];
}
}

这是一个与矩形进行比较的辅助方法:

BOOL rectIsEqualTo(CGRect a, CGRect b)
{
return a.origin.x == b.origin.x && a.origin.y == b.origin.y && a.size.width == b.size.width && a.size.height == b.size.height;
}

在drawRect:方法中,更新矩形用于仅绘制需要更新的部分。

- (void)drawRect:(CGRect)rect 
{
BOOL drawFullScreen = rectIsEqualTo( rect, self.frame );

// Drawing code

CGContextRef context = UIGraphicsGetCurrentContext();

// Turn coordinate system around

CGContextTranslateCTM( context, 0.0, self.frame.size.height );

CGContextScaleCTM( context, 1.0, -1.0 );

if ( drawFullScreen )
{
// draw the full thing
CGContextDrawImage( context, self.frame, self.image );
}
else
{
CGImageRef partialImage = CGImageCreateWithImageInRect( self.image, [self flippedRect:m_updateRect] );

CGContextDrawImage( context, m_updateRect, partialPhoto );

CGImageRelease( partialImage );
}

...

// Reset update box

m_updateRect = CGRectZero;
}

如果有人可以向我解释为什么翻转会起作用,我将不胜感激。

关于iphone - 设置需要显示矩形 : paints a white rectangle only,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/2585031/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com