在可缩放的视图上绘图 [英] Drawing on a zoomable view
问题描述
我正在开发一个小型绘图应用程序,它具有支持放大/缩小的基本要求。我有两个主要问题:
I'm working on a small drawing application, which has a basic requirement of supporting zoom-in/out. I have two main issues:
-
当视图被缩放/转换时,绘图看起来不清晰。是否有更好的方法,或者在缩放视图时是否有办法改善绘图?
Drawing doesn't appear crisp and clear, when view is zoomed/transformed. Is there a better approach, or is there a way to improve the drawing when the view is zoomed?
绘制1200 x时绘图性能很慢1200点帆布(在iPhone上)。我有机会为大帆布尺寸改进吗?
The drawing performance is slow, when drawing on 1200 x 1200 pts canvas (on iPhone). Any chance I can improve it for large canvas sizes?
缩放代码:
- (void)scale:(UIPinchGestureRecognizer *)gestureRecognizer {
[self adjustAnchorPointForGestureRecognizer:gestureRecognizer];
UIView *canvas = [gestureRecognizer view];
if ([gestureRecognizer state] == UIGestureRecognizerStateBegan ||
[gestureRecognizer state] == UIGestureRecognizerStateChanged) {
// Calculate the drawing view's size
CGSize drawingViewSize = ...;
// Calculate the minimum allowed tranform size
// Developer's Note: I actually wanted to use the size 1/4th of the view
// but self.view.frame.size doesn't return the correct (actual) width and height
// It returns these values inverted i.e. width as height, and vice verse.
// The reason is that the view appears to be transformed (90 degrees).
// Since there's no work-around this, so for now, I'm just using fixed values.
CGSize minTranformSize = CGSizeMake(100.0f, 100.0f);
if ((minTranformSize.width > drawingViewSize.width) && (minTranformSize.height > drawingViewSize.height)) {
minTranformSize = drawingViewSize;
}
// Transform the view, provided
// 1. It won't scale more than the original size of the background image
// 2. It won't scale less than the minimum possible transform
CGSize transformedSize = CGSizeMake(canvas.frame.size.width * [gestureRecognizer scale],
canvas.frame.size.height * [gestureRecognizer scale]);
if ((transformedSize.width <= drawingViewSize.width) && (transformedSize.height <= drawingViewSize.height) &&
(transformedSize.width >= minTranformSize.width) && (transformedSize.height >= minTranformSize.height)) {
canvas.transform = CGAffineTransformScale([canvas transform],
[gestureRecognizer scale],
[gestureRecognizer scale]);
}
[gestureRecognizer setScale:1.0];
} else if ([gestureRecognizer state] == UIGestureRecognizerStateEnded) {
// Recenter the container view, if required (piece is smaller than the view and it's not aligned)
CGSize viewSize = self.view.bounds.size;
if ((canvas.frame.size.width < viewSize.width) ||
(canvas.frame.size.height < viewSize.height)) {
canvas.center = CGPointMake(viewSize.width/2, viewSize.height/2);
}
// Adjust the x/y coordinates, if required (piece is larger than the view and it's moving outwards from the view)
if (((canvas.frame.origin.x > 0) || (canvas.frame.origin.y > 0)) &&
((canvas.frame.size.width >= viewSize.width) && (canvas.frame.size.height >= viewSize.height))) {
canvas.frame = CGRectMake(0.0,
0.0,
canvas.frame.size.width,
canvas.frame.size.height);
}
canvas.frame = CGRectIntegral(canvas.frame);
}
}
绘图代码
- (void)draw {
CGContextRef context = UIGraphicsGetCurrentContext();
CGContextSaveGState(context);
if (self.fillColor) {
[self.fillColor setFill];
[self.path fill];
}
if ([self.strokeColor isEqual:[UIColor clearColor]]) {
[self.path strokeWithBlendMode:kCGBlendModeClear alpha:1.0];
} else if (self.strokeColor) {
[self.strokeColor setStroke];
[self.path stroke];
}
CGContextRestoreGState(context);
}
推荐答案
这是一个非常复杂的问题,我一直在努力。
This is a pretty complicated problem, that I have struggled a lot with.
我最终将图纸转换为矢量。
I ended up converting the drawings to vector.
- 绘制所有行一层,在另一层中绘制所有填充。
- 使用potrace将线图转换为Vector( http://potrace.sourceforge.net/ )
- 使用SVGKit
绘制向量( https://github.com/SVGKit/SVGKit )并隐藏1)中绘制的图层
- draw all lines in one layer, draw all fills in another.
- Convert the line drawings to Vector, using potrace (http://potrace.sourceforge.net/)
- draw the vector using SVGKit (https://github.com/SVGKit/SVGKit) and hide the layer drawn in 1)
它工作得很好而且相当快,但它需要大量的工作。我们公司的应用程序采用了这种技术:
It is working pretty well and fairly fast, but it requires a lot of work. We have an app in our company that applies this technique:
https://itunes.apple.com/us/app/ideal-paint-hd-mormor/id569450492?mt=8 。
如果您唯一的问题是性能,请尝试查看 CATiledLayer
。 (也用于上面提到的应用程序)。它将极大地提高性能(你可以在这里找到一个非常好的教程 http:// www.cimgf.com/2011/03/01/subduing-catiledlayer/ )。
If your only problem is performance, try taking a look at CATiledLayer
. (also used in app mentioned above). It will increase performance tremendously (You can find a pretty good tutorial here http://www.cimgf.com/2011/03/01/subduing-catiledlayer/).
祝你好运! :)
这篇关于在可缩放的视图上绘图的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!