2012-02-03 35 views
5

Tôi đang cố gắng tạo chức năng di chuyển cho ImageView của mình (maskPreview trong mã bên dưới), để người dùng có thể di chuyển ảnh, được chứa trong maskPreview, xung quanh màn hình. Đây là mã của tôi để liên lạc bắt đầu và chạm vào được di chuyển:Cách di chuyển UIImageView bằng Touch

-(void)touchesBegan:(NSSet *)touches withEvent:(UIEvent *)event 
{ 
if ([touches count]==1) { 
    UITouch *touch= [touches anyObject]; 
    originalOrigin = [touch locationInView:maskPreview]; 
} 
} 
-(void)touchesMoved:(NSSet *)touches withEvent:(UIEvent *)event 
{ 
if ([touches count]==1) { 
    UITouch *touch = [touches anyObject]; 
    CGPoint lastTouch = [touch previousLocationInView:self.view]; 
    CGFloat movedDistanceX = originalOrigin.x-lastTouch.x; 
    CGFloat movedDistanceY = originalOrigin.y-lastTouch.y; 
    [maskPreview setFrame:CGRectMake(maskPreview.frame.origin.x+movedDistanceX, maskPreview.frame.origin.y + movedDistanceY, maskPreview.frame.size.width, maskPreview.frame.size.height)]; 
} 
} 

nhưng tôi nhận được một số phản hồi lạ từ ứng dụng. Tôi đã không đưa ra những hạn chế về tầm nhìn xa có thể di chuyển, tức là để ngăn không cho nó đi ra ngoài màn hình, nhưng ngay cả khi đó là một động thái nhỏ, trí tưởng tượng của tôi trở nên hoang dại và biến mất.

Cảm ơn rất nhiều trước cho tất cả sự giúp đỡ

Trả lời

9

Thực hiện touchesBegan và vân vân là cách quá mức cần thiết trong thế giới hiện đại này. Bạn chỉ đang bối rối với bản thân, và mã của bạn sẽ nhanh chóng trở thành không thể hiểu hoặc duy trì được. Sử dụng UIPanGestureRecognizer; đó là những gì nó cho. Việc tạo chế độ xem có thể kéo bằng UIPanGestureRecognizer là không đáng kể. Dưới đây là trình xử lý tác vụ cho UIPanGestureRecognizer giúp chế độ xem có thể kéo:

- (void) dragging: (UIPanGestureRecognizer*) p { 
    UIView* vv = p.view; 
    if (p.state == UIGestureRecognizerStateBegan || 
     p.state == UIGestureRecognizerStateChanged) { 
     CGPoint delta = [p translationInView: vv.superview]; 
     CGPoint c = vv.center; 
     c.x += delta.x; c.y += delta.y; 
     vv.center = c; 
     [p setTranslation: CGPointZero inView: vv.superview]; 
    } 
} 
+0

Tuyệt vời Matt, bạn là một thiên tài tuyệt đối !! Đã đánh giá câu trả lời của bạn nhưng tôi không có đủ danh tiếng !! làm cho cuộc sống của tôi dễ dàng hơn nhiều !! – Septronic

+0

Chỉ cần FYI, mã đó xuất hiện trực tiếp trong cuốn sách của tôi: http://shop.oreilly.com/product/0636920023562.do - Nhiều thứ khác xuất phát từ ... – matt

+0

tuyệt vời, tôi sẽ xem xét nó :) cảm ơn – Septronic

2

Có hai vấn đề với mã của bạn. Thứ nhất, dòng này là sai:

CGPoint lastTouch = [touch previousLocationInView:self.view]; 

Nó phải được điều này:

CGPoint lastTouch = [touch previousLocationInView:maskPreview]; 

Thực sự, bạn thậm chí không nên được sử dụng previousLocationInView:. Bạn chỉ nên sử dụng locationInView: như thế này:

CGPoint lastTouch = [touch locationInView:maskPreview]; 

Thứ hai, bạn đang nhận được những dấu hiệu của movedDistanceXmovedDistanceY sai. Thay đổi họ này:

CGFloat movedDistanceX = lastTouch.x - originalOrigin.x; 
CGFloat movedDistanceY = lastTouch.y - originalOrigin.y; 

Ngoài ra, các tài liệu hướng dẫn cho touchesBegan:withEvent: nói điều này:

Nếu bạn ghi đè phương pháp này mà không gọi super (việc sử dụng mô hình phổ biến), bạn cũng phải ghi đè lên các phương pháp khác để xử lý các sự kiện cảm ứng, nếu chỉ là triển khai sơ khai (empy).

Vì vậy, hãy đảm bảo bạn cũng ghi đè touchesEnded:withEvent:touchesCancelled:withEvent:.

Dù sao, bạn có thể làm điều này khá đơn giản hơn một chút. Một cách là làm cho touchesBegan:withEvent: trống và thực hiện tất cả công việc trong touchesMoved:withEvent: bằng cách sử dụng cả hai previousLocationInView:locationInView: và cập nhật maskPreview.center thay vì maskPreview.frame. Bạn thậm chí sẽ không cần phải biến originalOrigin dụ:

-(void)touchesBegan:(NSSet *)touches withEvent:(UIEvent *)event 
{ 
} 

-(void)touchesMoved:(NSSet *)touches withEvent:(UIEvent *)event 
{ 
    if ([touches count]==1) { 
     UITouch *touch = [touches anyObject]; 
     CGPoint p0 = [touch previousLocationInView:maskPreview]; 
     CGPoint p1 = [touch locationInView:maskPreview]; 
     CGPoint center = maskPreview.center; 
     center.x += p1.x - p0.x; 
     center.y += p1.y - p0.y; 
     maskPreview.center = center; 
    } 
} 

Một cách khác để làm điều này là bằng cách sử dụng một UIPanGestureRecognizer. Tôi để nó như một bài tập cho người đọc.

+0

Hi Rob, Cảm ơn câu trả lời, và nhận ra những sai lầm trong mã của tôi !! Tôi đã sử dụng hướng dẫn của Matt cho UIPanGestureRecognizer, và nó đã làm việc một điều trị. Nhưng một chút về việc vượt qua tất cả các sự kiện liên lạc là một sự trợ giúp tuyệt vời, tôi không biết và không nghĩ rằng chúng ta nên làm điều đó. – Septronic

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