借助Retina显示屏?

时间:2013-10-18 03:08:52

标签: ios objective-c cocoa-touch

我最近使我的应用程序与最新的视网膜iPad兼容,但我的图纸变得模糊不清。然后我尝试更改了contextWithOptions,但是当我画画时它变得非常迟钝和锯齿状。我尝试过的一切都行不通。有什么想法吗?

- (void)touchesMoved:(NSSet *)touches withEvent:(UIEvent *)event {
    mouseSwiped = YES;

    UITouch *touch = [touches anyObject];
    CGPoint currentPoint = [touch locationInView:self.view];
    if (UIGraphicsBeginImageContextWithOptions != NULL) {
        UIGraphicsBeginImageContextWithOptions((self.view.frame.size), NO, 1);
        //becomes laggy if I set it to 0 or 2. ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
    } else {
        UIGraphicsBeginImageContext(self.view.frame.size);
    }
    [self.tempDrawImage.image drawInRect:CGRectMake(0, 0, self.view.frame.size.width, self.view.frame.size.height)];
    CGContextMoveToPoint(UIGraphicsGetCurrentContext(), lastPoint.x, lastPoint.y);
    CGContextAddLineToPoint(UIGraphicsGetCurrentContext(), currentPoint.x, currentPoint.y);
    CGContextSetLineCap(UIGraphicsGetCurrentContext(), kCGLineCapRound);
    CGContextSetLineWidth(UIGraphicsGetCurrentContext(), brush );
    CGContextSetRGBStrokeColor(UIGraphicsGetCurrentContext(), red, green, blue, 1.0);
    CGContextSetBlendMode(UIGraphicsGetCurrentContext(),kCGBlendModeNormal);

    CGContextStrokePath(UIGraphicsGetCurrentContext());
    self.tempDrawImage.image = UIGraphicsGetImageFromCurrentImageContext();
    [self.tempDrawImage setAlpha:opacity];
    UIGraphicsEndImageContext();

    lastPoint = currentPoint;
}

- (void)touchesEnded:(NSSet *)touches withEvent:(UIEvent *)event {
    if(!mouseSwiped) {
        UIGraphicsBeginImageContext(self.view.frame.size);
        [self.tempDrawImage.image drawInRect:CGRectMake(0, 0, self.view.frame.size.width, self.view.frame.size.height)];
        CGContextSetLineCap(UIGraphicsGetCurrentContext(), kCGLineCapRound);
        CGContextSetLineWidth(UIGraphicsGetCurrentContext(), brush);
        CGContextSetRGBStrokeColor(UIGraphicsGetCurrentContext(), red, green, blue, opacity);
        CGContextMoveToPoint(UIGraphicsGetCurrentContext(), lastPoint.x, lastPoint.y);
        CGContextAddLineToPoint(UIGraphicsGetCurrentContext(), lastPoint.x, lastPoint.y);
        CGContextStrokePath(UIGraphicsGetCurrentContext());
        CGContextFlush(UIGraphicsGetCurrentContext());
        self.tempDrawImage.image = UIGraphicsGetImageFromCurrentImageContext();
        UIGraphicsEndImageContext();
    }

      UIGraphicsBeginImageContextWithOptions((self.view.frame.size), NO, 0);
    [self.mainImage.image drawInRect:CGRectMake(0, 0, self.view.frame.size.width, self.view.frame.size.height) blendMode:kCGBlendModeNormal alpha:1.0];
    [self.tempDrawImage.image drawInRect:CGRectMake(0, 0, self.view.frame.size.width, self.view.frame.size.height) blendMode:kCGBlendModeNormal alpha:opacity];
    self.mainImage.image = UIGraphicsGetImageFromCurrentImageContext();
    self.tempDrawImage.image = nil;
    UIGraphicsEndImageContext();
}

也许我应该在用户结束触摸时更改图像?有什么帮助吗?

1 个答案:

答案 0 :(得分:1)

正确,您不想尝试为视图中的每次触摸创建图像。你只想画出你的路径。或者,更准确地说,您希望您的触摸手势(a)更新您的模型,该模型由一堆路径数组成(每条路径本身就是一个点数组); (b)调用必要的调用来更新更新模型的UI。

要渲染图纸,您有两种基本方法:

  1. 创建一个UIView子类,该子类具有drawRect方法,该方法遍历您的一系列路径并绘制它们;或

  2. 创建一个使用您的路径的CAShapeLayer,然后[self.view.layer addSublayer:layer]

  3. 两种技术都没问题。但请注意,在这些技巧中,您都不会在手势中执行任何UIGraphicsBeginImageContextUIGraphicsGetImageFromCurrentImageContextUIGraphicsEndImageContext。只有当你想将图形保存为图像时(大概是在完成用户的绘图手势之后),才能这样做。

    但是如果你这样做,即使在视网膜屏幕上,你也可以毫不费力地跟上用户的手势。操作图像是一个缓慢且内存效率低的过程,所以你只想谨慎地做到这一点。

    顺便说一句,如果你将这一系列路径作为绘图模型的核心部分,那么它也会带来其他机会。例如,很容易"撤消"一个路径,只需从模型中删除该路径对象并重新渲染视图即可。但如果你把它保存为图像,删除几个stokes变得不切实际。

    最后,你必须决定你的应用程序是否是一个矢量绘图应用程序(你保存的文件是路径数组,也可能是保存图像的选项)或者它是否更多一个位图编辑器(最后,你丢弃矢量信息,只保存位图)。无论采用哪种方法,在手势期间使用路径对象都可能使UI更具响应性。