2010-02-08 44 views
6

Tôi có mã sau để xác định xem một lần chạm có nằm trong chế độ xem hình ảnh trong ô bảng của tôi hay không. Tuy nhiên, nó không hoạt động. Tôi đã so sánh hai với CGRectContainsPoint tuy nhiên, nó không hoạt động. Đây là mã:So sánh vị trí UITouch với hình chữ nhật UIImageView

-(void)touchesBegan:(NSSet *)touches withEvent:(UIEvent *)event  
{ 
    // Declare the touch and get it's location 

    UITouch *touch = [touches anyObject]; 

    CGPoint touchLocation = [touch locationInView:self]; 

    if (CGRectContainsPoint(myImageView.frame, touchLocation)) 
    { 
     NSLog(@"Tapped image view"); 
    }  
} 

Cảm ơn sự giúp đỡ!

Trả lời

26

Tuy nhiên, nó không hoạt động.

Vui lòng cụ thể hơn.

UITouch *touch = [touches anyObject]; 

Tại sao không kiểm tra mỗi touch, và không chỉ đơn giản là một * ngẫu nhiên lựa chọn trong số họ?

* The documentation for anyObject nói rằng bạn không được bảo đảm cái nào sẽ cung cấp cho bạn. Bạn thậm chí không được đảm bảo rằng nó sẽ là ngẫu nhiên; nó có thể là cùng một đối tượng mỗi lần. Luật Murphy nói rằng, cho dù đó là ngẫu nhiên hay không, nó sẽ là sai lầm.

CGPoint touchLocation = [touch locationInView:self]; 
if (CGRectContainsPoint(myImageView.frame, touchLocation)) 

bạn frame là trong hệ thống phối hợp của SuperView của bạn; [touch locationInView:self] trả về điểm tiếp xúc trong hệ thống phối hợp của bạn. Bạn muốn kiểm tra trong phạm vi bounds, nằm trong hệ thống điều phối của bạn. The documentation explains the difference.

+0

mở rộng: 'CGPoint touchLocation = [touch locationInView: self]; if (CGRectContainsPoint (myImageView.frame, touchLocation)) 'chỉ hoạt động nếu' myImageView' là một subview trực tiếp của 'self' –

+1

mở rộng trên bình luận của Joao, bạn có thể nhận được khung của subview tương ứng với superview (hoặc bất kỳ khung nhìn nào) với' CGRect frameRelativeToView = [myImageView convertRect: myImageView.bounds toView: self] ' – chazzwozzer

1

Vấn đề là bạn cần phải gọi [touch locationInView: myImageView] để lấy điểm trong hệ tọa độ lượt xem hình ảnh. Sau đó, kiểm tra của bạn để xem nếu nó trong khung.

0

Hãy nhớ rằng khi bạn đang yêu cầu một liên lạc cho vị tríInView :, bạn đang nhận được một điểm tương đối so với khung của chế độ xem đó. Vì vậy, giả định các đoạn mã bạn đã được chứa trong một lớp con của UIViewController bạn nên hỏi cho

CGPoint touchLocation = [touch locationInView:self.view]; 

Mà sẽ cung cấp cho bạn một điểm so với quan điểm của bạn. Lý do bạn muốn một điểm liên quan đến chế độ xem hiện tại của bạn là do khung của chế độ xem hình ảnh của bạn cũng có liên quan đến chế độ xem gốc - cùng một chế độ xem. Vì vậy, bây giờ nó sẽ làm việc.

if (CGRectContainsPoint(myImageView.frame, touchLocation)) { 
    NSLog(@"Tapped image view"); 
} 
1
UITouch *touch = [[event allTouches] anyObject]; 
CGPoint location = [touch locationInView:self]; 
if ([touch view]==view) { 
view.center=location; 
} 

ghi nó trong trường hợp cảm ứng di chuyển. thanx

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