2012-02-14 33 views
6

Tôi đang vẽ các đường theo phương pháp touchesMoved: và thông thường nó hoạt động tốt. Nhưng khi tôi phóng to hình ảnh và vẽ, các đường vẽ trước đó đều bị dịch chuyển và tiếp tục ngày càng mờ đi, cuối cùng biến mất. Tôi đã thử sử dụng UIPinchGestureRecognizer và chỉ cần tăng frame của myImageView (chỉ dành cho các sự kiện đa chạm) nhưng sự cố xảy ra theo cả hai cách. Dưới đây là đoạn code để vẽ:CGContextStrokePath không hoạt động khi phóng to và vẽ hình ảnh

- (void)touchesMoved:(NSSet *)touches withEvent:(UIEvent *)event { 
NSArray *allTouches = [touches allObjects]; 
int count = [allTouches count]; 
if(count==1){//single touch case for drawing line 
    UITouch *touch = [touches anyObject]; 
    CGPoint currentPoint = [touch locationInView:myImageView]; 
    UIGraphicsBeginImageContext(myImageView.frame.size); 
    [drawImage.image drawInRect:CGRectMake(0, 0, myImageView.frame.size.width, myImageView.frame.size.height)]; 
    CGContextSetLineCap(UIGraphicsGetCurrentContext(), kCGLineCapRound); 
    CGContextSetLineWidth(UIGraphicsGetCurrentContext(), 2.0); 
    CGContextBeginPath(UIGraphicsGetCurrentContext()); 
    CGContextMoveToPoint(UIGraphicsGetCurrentContext(), lastPoint.x, lastPoint.y); 
    CGContextAddLineToPoint(UIGraphicsGetCurrentContext(), currentPoint.x, currentPoint.y); 
    CGContextStrokePath(UIGraphicsGetCurrentContext()); 
    drawImage.image = UIGraphicsGetImageFromCurrentImageContext(); 
    UIGraphicsEndImageContext(); 
    lastPoint = currentPoint; 
} 
else{//multi touch case 
    // handle pinch/zoom 
    } 
} 

đây là hình ảnh được vẽ trên mà không cần phóng to:

enter image description here

Và đây là hình ảnh miêu tả các vấn đề sau khi phóng to-in với mũi tên đỏ cho thấy phân khúc đã được vẽ trước khi phóng to (như trong hình trước). Những hình ảnh vừa mờ và di dời:

enter image description here

Nó cũng có thể được nhận thấy rằng một phần của đường vẽ về phía cuối cùng là không bị ảnh hưởng và hiện tượng này xảy ra đối với các dòng kẻ trở về quá khứ. Tôi tin rằng lý do cho điều này là các thuộc tính kích thước hình ảnh đang bị mất khi tôi phóng to/thu nhỏ có thể gây mờ và thay đổi, nhưng tôi không chắc chắn về điều đó!

EDIT - Tôi đã tải lên a short video để hiển thị những gì đang diễn ra. Đó là loại giải trí ...

EDIT 2- Đây là a sample single-view app tập trung vào vấn đề.

+0

Tôi nghĩ rằng điều này có thể có liên quan đến contentMode của chế độ xem bạn đang vẽ. Hãy thử UIViewContentModeRedraw? – kevboh

+0

Tôi đã thử đặt nó cho 'myImageView' và' drawImage' (cả hai đều là 'UIImageView's) nhưng nó không hoạt động: (... – tipycalFlow

+0

@kevboh Tôi đã tải lên video (và được thêm vào câu trả lời) có thể cung cấp cho bạn một ý tưởng tốt hơn về vấn đề này ... – tipycalFlow

Trả lời

4

Tôi đã tải xuống dự án của bạn và tôi thấy vấn đề là tự động hóa. Các bước sau đây sẽ giải quyết nó:

Bước 1. Comment dòng 70:

drawImage.frame = CGRectMake(0, 0, labOrderImgView.frame.size.width, labOrderImgView.frame.size.height); 

trong phương pháp touchesMoved của bạn.

Bước 2. Thêm một dòng mã sau drawImage là alloc ed (dòng 90) trong viewDidLoad phương pháp:

drawImage.autoresizingMask = UIViewAutoresizingFlexibleWidth | UIViewAutoresizingFlexibleHeight; 

Sau đó, các lỗi đã được khắc.

+0

Tuyệt đối rực rỡ ... cảm ơn người đàn ông! Bạn xứng đáng được nhiều upvotes hơn! – tipycalFlow

1

tôi thực hiện hành vi như thế này trong cách tiếp theo:

  1. Bạn nên nhớ tất cả tọa độ của đường dẫn của bạn (MODEL).
  2. Vẽ đường dẫn của bạn vào chế độ xem phụ tạm thời của imageView.
  3. Khi người dùng bắt đầu chụm/thu phóng hình ảnh của bạn - không làm gì cả, tức là đường dẫn sẽ được chia tỷ lệ theo số điện thoại iOS
  4. Khi người dùng đã hoàn thành thu phóng pinch - vẽ lại đường dẫn của bạn theo cách chính xác bằng cách sử dụng mô hình của bạn.

Nếu bạn lưu đường dẫn làm hình ảnh, bạn sẽ thu được tỷ lệ tìm kiếm kém. Ngoài ra - không vẽ đường thẳng đến hình ảnh - vẽ đến một số chế độ xem trong suốt và chia chúng với nhau khi kết thúc chỉnh sửa.

+0

BTW, tôi coi bạn Ví dụ mã - và tôi sẽ khuyên bạn nên thực hiện việc bắt/tách đường dẫn riêng biệt với bản vẽ, điều này có thể giúp bạn tránh được nhiều rắc rối Mô hình Model-View-Controller – SVGreg

+0

Thực ra, kết quả xấu không đến trong khi phóng to. Tôi vẽ ** sau khi ** phóng to sự kỳ quặc này xảy ra. Hãy xem video ngắn trong câu hỏi để có ý tưởng hay hơn – tipycalFlow

+0

Có tôi đã xem video - đó là một số hiệu ứng mờ - không vẽ đường thẳng tới hình ảnh - vẽ một số minh bạch vie w và chia chúng lại với nhau ở cuối chỉnh sửa. – SVGreg

1

Bạn luôn vẽ hình ảnh theo kích thước của chế độ xem hình ảnh - điều này tất nhiên bị mờ, vì bạn không thích ứng với độ phân giải cao hơn khi phóng to. Thay vào đó, hãy tạo UIBezierPath một lần nữa và chỉ thêm một dòng vào nó (với addLineToPoint:) theo phương pháp touchesMoved, sau đó vẽ nó theo phương thức tùy chỉnh drawRect qua [bezierPath stroke]. Bạn cũng có thể thêm CAShapeLayer làm chế độ xem phụ của chế độ xem hình ảnh và đặt thuộc tính path thành thuộc tính CGPath của số bezierPath mà bạn đã tạo trước đó.

Xem Drawing bezier curves with my finger in iOS? để biết ví dụ.

Các vấn đề liên quan