Tôi đã đặt một hình ảnh (UIImageView) trên thanh điều hướng. Bây giờ tôi muốn phát hiện sự kiện chạm và muốn xử lý sự kiện. Bạn có thể cho tôi biết làm thế nào tôi có thể làm điều đó?
Cảm ơn.
Tôi đã đặt một hình ảnh (UIImageView) trên thanh điều hướng. Bây giờ tôi muốn phát hiện sự kiện chạm và muốn xử lý sự kiện. Bạn có thể cho tôi biết làm thế nào tôi có thể làm điều đó?
Cảm ơn.
Câu trả lời:
Về mặt thực tế, đừng làm vậy.
Thay vào đó, hãy thêm một nút có kiểu Tùy chỉnh (không có đồ họa nút trừ khi bạn chỉ định hình ảnh) trên UIImageView. Sau đó đính kèm bất kỳ phương thức nào bạn muốn được gọi vào đó.
Bạn có thể sử dụng kỹ thuật đó cho nhiều trường hợp mà bạn thực sự muốn một số khu vực trên màn hình hoạt động như một nút thay vì làm rối tung nội dung Touch.
A UIImageView
có nguồn gốc từ a UIView
có nguồn gốc từ UIResponder
đó để nó sẵn sàng xử lý các sự kiện chạm. Bạn sẽ muốn cung cấp touchesBegan
, touchesMoved
và touchesEnded
các phương pháp và họ sẽ được gọi nếu người dùng chạm vào hình ảnh. Nếu tất cả những gì bạn muốn là một sự kiện nhấn, sẽ dễ dàng hơn chỉ cần sử dụng một nút tùy chỉnh với hình ảnh được đặt làm hình ảnh nút. Nhưng nếu bạn muốn kiểm soát chi tiết hơn đối với các lần nhấn, di chuyển, v.v. thì đây là cách để thực hiện.
Bạn cũng sẽ muốn xem xét một số điều khác:
Ghi đè canBecomeFirstResponder
và trả về CÓ để chỉ ra rằng chế độ xem có thể trở thành tâm điểm của các sự kiện chạm (mặc định là KHÔNG).
Đặt thuộc userInteractionEnabled
tính thành CÓ. Mặc định cho UIViews
là CÓ, nhưng cho UIImageViews
là KHÔNG nên bạn phải bật rõ ràng.
Nếu bạn muốn phản hồi các sự kiện đa chạm (tức là chụm, thu phóng, v.v.), bạn sẽ muốn đặt multipleTouchEnabled
thành CÓ.
userInteractionEnabled
thành CÓ trên chế độ xem của cha mẹ tôi. Xem stackoverflow.com/questions/5887305/…
Để thêm sự kiện cảm ứng vào UIImageView, hãy sử dụng phần sau trong tệp .m của bạn
UITapGestureRecognizer *newTap = [[UITapGestureRecognizer alloc] initWithTarget:self action:@selector(myTapMethod)];
[myImageView setUserInteractionEnabled:YES];
[myImageView addGestureRecognizer:newTap];
-(void)myTapMethod{
// treat image tap
}
hy vọng rằng sẽ giúp.
Bạn cũng có thể thêm một UIGestureRecognizer. Nó không yêu cầu bạn thêm một phần tử bổ sung trong hệ thống phân cấp chế độ xem của mình, nhưng vẫn cung cấp cho bạn tất cả mã được viết độc đáo để xử lý các sự kiện chạm với một giao diện khá đơn giản:
UISwipeGestureRecognizer *swipeRight = [[UISwipeGestureRecognizer alloc]
initWithTarget:self action:@selector(handleSwipe:)];
swipeRight.direction = UISwipeGestureRecognizerDirectionRight;
[imgView_ addGestureRecognizer:swipeRight];
[swipeRight release];
UISwipeGestureRecognizer *swipeLeft = [[UISwipeGestureRecognizer alloc]
initWithTarget:self action:@selector(handleSwipe:)];
swipeLeft.direction = UISwipeGestureRecognizerDirectionLeft;
[imgView_ addGestureRecognizer:swipeLeft];
[swipeLeft release];
Tôi đã tham gia các chủ đề khác nhau trong vài giờ qua để cố gắng tìm giải pháp cho vấn đề của mình, nhưng vô ích. Tôi thấy rằng nhiều nhà phát triển chia sẻ vấn đề này và tôi nghĩ mọi người ở đây đều biết về điều này. Tôi có nhiều hình ảnh bên trong a UIScrollView
, đang cố gắng lấy các sự kiện nhấn vào chúng.
không nhận được bất kỳ sự kiện nào từ một UIImangeView
, nhưng tôi nhận được một sự kiện từ một sự kiện tương tự UILable
với các thông số rất giống tôi đang đặt cho nó. dưới IOS 5.1.
Tôi đã làm như sau:
UIImageView
.UIImageView
, không giúp được gì.Đính kèm một số mã bên dưới, trong mã này, tôi khởi tạo cả a UIImageView
và UILabel
, nhãn hoạt động tốt về mặt các sự kiện kích hoạt. Tôi đã cố gắng giữ mã không liên quan. Cảm ơn các bạn, Ilan
UIImageView *single_view = [[UIImageView alloc]initWithFrame:CGRectMake(200, 200, 100, 100)];
single_view.image=img;
single_view.layer.zPosition=4;
UITapGestureRecognizer *singleTap = [[UITapGestureRecognizer alloc] initWithTarget:self action:@selector(singleTapGestureCaptured:)];
[single_view addGestureRecognizer:singleTap];
[single_view setMultipleTouchEnabled:YES];
[single_view setUserInteractionEnabled:YES];
[self.myScrollView addSubview:single_view];
self.myScrollView.userInteractionEnabled=YES;
UILabel *testLabel = [[UILabel alloc] initWithFrame:CGRectMake(100, 100, 100, 100)];
testLabel.backgroundColor=[UIColor redColor];
[self.myScrollView addSubview:testLabel];
[testLabel addGestureRecognizer:singleTap];
[testLabel setMultipleTouchEnabled:YES];
[testLabel setUserInteractionEnabled:YES];
testLabel.layer.zPosition=4;
Và phương thức xử lý sự kiện:
- (void)singleTapGestureCaptured:(UITapGestureRecognizer *)gesture
{
UIView *tappedView = [gesture.view hitTest:[gesture locationInView:gesture.view] withEvent:nil];
NSLog(@"Touch event on view: %@",[tappedView class]);
}
Như đã nói, vòi nhãn được nhận.
Thay vì tạo một UIImageView có thể chạm vào sau đó đặt nó trên thanh điều hướng, bạn chỉ nên tạo một UIBarButtonItem, cái mà bạn tạo ra từ UIImageView.
Đầu tiên hãy xem hình ảnh:
UIImageView *yourImageView = [[UIImageView alloc] initWithImage:[UIImage imageNamed:@"nameOfYourImage.png"]];
Sau đó, đặt mục nút ra khỏi chế độ xem hình ảnh của bạn:
UIBarButtonItem *yourBarButtonItem = [[UIBarButtonItem alloc] initWithCustomView:yourImageView];
Sau đó, thêm mục nút thanh vào thanh điều hướng của bạn:
self.navigationItem.rightBarButtonItem = yourBarButtonItem;
Hãy nhớ rằng mã này đi vào bộ điều khiển chế độ xem nằm bên trong mảng bộ điều khiển chế độ xem bộ điều khiển điều hướng. Vì vậy, về cơ bản, "mục nút thanh có hình ảnh có thể chạm vào" này sẽ chỉ xuất hiện trong thanh điều hướng khi bộ điều khiển chế độ xem này khi nó được hiển thị. Khi bạn ấn một bộ điều khiển chế độ xem khác, mục nút thanh điều hướng này sẽ biến mất ~
Những gì bạn có thể muốn làm là ghi đè touchesBegan:withEvent:
phương thức của UIView
(hoặc lớp con) chứa chế độ xem phụ của bạn UIImageView
.
Trong phương pháp này, hãy kiểm tra xem có bất kỳ UITouch
chạm nào nằm trong giới hạn của UIImageView
phiên bản không (giả sử nó được gọi imageView
).
Tức là CGPoint
phần tử có [touch locationInView]
giao nhau với CGRect
phần tử [imageView bounds]
không? Nhìn vào chức năng CGRectContainsPoint
để chạy thử nghiệm này.
Đối với những người bạn đang tìm kiếm một giải pháp Swift 4 cho câu trả lời này. Bạn có thể sử dụng cách sau để phát hiện sự kiện chạm trên UIImageView.
let gestureRecognizer: UITapGestureRecognizer = UITapGestureRecognizer(target: self, action: #selector(imageViewTapped))
imageView.addGestureRecognizer(gestureRecognizer)
imageView.isUserInteractionEnabled = true
Sau đó, bạn sẽ cần xác định bộ chọn của mình như sau:
@objc func imageViewTapped() {
// Image has been tapped
}
Thêm cử chỉ trên chế độ xem đó. Thêm hình ảnh vào chế độ xem đó thì nó cũng sẽ phát hiện cử chỉ trên hình ảnh. Bạn có thể thử với phương pháp ủy quyền của sự kiện cảm ứng rồi trong trường hợp đó nó cũng có thể phát hiện được không. Cảm ơn