Tôi đang làm việc trên một ứng dụng vẽ nhỏ, có yêu cầu cơ bản về hỗ trợ phóng to/thu nhỏ. Tôi có hai vấn đề chính:Vẽ trên chế độ xem có thể thu phóng
Vẽ không xuất hiện rõ nét và rõ ràng, khi chế độ xem được thu nhỏ/chuyển đổi. Có cách tiếp cận tốt hơn không, hoặc có cách nào để cải thiện bản vẽ khi chế độ xem được thu phóng không?
Hiệu suất bản vẽ chậm, khi vẽ trên canvas 1200 x 1200 pixel (trên iPhone). Bất kỳ cơ hội nào tôi có thể cải thiện nó cho kích thước canvas lớn?
Zooming Code:
- (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);
}
}
Vẽ Mã
- (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);
}
Thật vậy, nó trông giống như rất nhiều công việc, và tôi tự hỏi những gì loại hiệu suất (về cả thời gian và fps) bạn đang nhận được trong ứng dụng sơn của bạn? – Mustafa
Việc truy tìm khá tốn thời gian (vài giây), bản vẽ là mặt khác rất nhanh. Chiến lược của chúng tôi là cho phép người dùng vẽ mà không cần truy tìm, cho đến khi người dùng chọn một công cụ khác bắt đầu thu phóng. Sau đó, chúng tôi hiển thị một spinner trong khi chúng tôi thực hiện truy tìm. – EsbenB