首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >setNeedsDisplayInRect:仅绘制白色矩形

setNeedsDisplayInRect:仅绘制白色矩形
EN

Stack Overflow用户
提问于 2010-04-06 21:16:59
回答 2查看 2.2K关注 0票数 3

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

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

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

1)当用户触摸屏幕时,该触摸被渲染到掩码中2)当调用drawRect:时,图像被该掩码屏蔽

我肯定忽略了一些简单的东西,不是吗?

EN

回答 2

Stack Overflow用户

发布于 2010-04-13 22:48:55

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

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

代码语言:javascript
复制
- (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 );
}

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

代码语言:javascript
复制
- (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 );
}

在渲染触摸中,‘翻转’的更新矩形是强制的:

代码语言:javascript
复制
- (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] );
    }
}   

在指纹绘制过程中,整个视图以大约20 is的频率刷新。下面的方法每隔1/20秒调用一次,并提交矩形进行渲染:

代码语言:javascript
复制
- (void) refreshScreen
{
    if ( m_updateRect.size.width > 0 )
    {
        [self setNeedsDisplayInRect:[self flippedRect:m_updateRect]];
    }
}

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

代码语言:javascript
复制
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:方法中,更新矩形用于仅绘制需要更新的部分。

代码语言:javascript
复制
- (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;
}

如果有人能向我解释为什么翻转是可行的,我将不胜感激。

票数 2
EN

Stack Overflow用户

发布于 2012-03-08 09:14:28

翻转问题最有可能是因为与核心图形相比,UIKit的坐标是“翻转的”。

苹果文档here

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/2585031

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档