Saya telah menempatkan gambar (UIImageView) di bilah navigasi. Sekarang saya ingin mendeteksi acara sentuh dan ingin menangani acara tersebut. Bisakah Anda memberi tahu saya bagaimana saya bisa melakukan itu?
Terima kasih.
Saya telah menempatkan gambar (UIImageView) di bilah navigasi. Sekarang saya ingin mendeteksi acara sentuh dan ingin menangani acara tersebut. Bisakah Anda memberi tahu saya bagaimana saya bisa melakukan itu?
Terima kasih.
Jawaban:
Secara praktis, jangan lakukan itu.
Sebagai gantinya, tambahkan tombol dengan gaya Kustom (tanpa grafik tombol kecuali Anda menentukan gambar) di UIImageView. Kemudian lampirkan metode apa pun yang ingin Anda panggil ke sana.
Anda dapat menggunakan teknik itu untuk banyak kasus di mana Anda benar-benar ingin beberapa area layar berfungsi sebagai tombol alih-alih mengotak-atik barang-barang Touch.
A UIImageView
diturunkan dari a UIView
yang diturunkan UIResponder
sehingga siap untuk menangani kejadian sentuh. Anda akan ingin memberikan touchesBegan
, touchesMoved
dan touchesEnded
metode dan mereka akan dipanggil jika pengguna mengetuk gambar. Jika yang Anda inginkan hanyalah acara ketuk, lebih mudah menggunakan tombol khusus dengan gambar disetel sebagai gambar tombol. Tetapi jika Anda ingin kontrol yang lebih baik atas ketukan, gerakan, dll. Ini adalah cara yang tepat.
Anda juga ingin melihat beberapa hal lagi:
Timpa canBecomeFirstResponder
dan kembali YA untuk menunjukkan bahwa tampilan dapat menjadi fokus peristiwa sentuh (standarnya adalah TIDAK).
Setel userInteractionEnabled
properti ke YA. Default untuk UIViews
adalah YA, tetapi untuk UIImageViews
TIDAK jadi Anda harus menyalakannya secara eksplisit.
Jika Anda ingin menanggapi peristiwa multi-sentuh (misalnya mencubit, memperbesar, dll.), Anda harus menyetel multipleTouchEnabled
ke YA.
userInteractionEnabled
ke YA pada tampilan orang tua saya. Lihat stackoverflow.com/questions/5887305/…
Untuk menambahkan peristiwa sentuh ke UIImageView, gunakan yang berikut ini di .m Anda
UITapGestureRecognizer *newTap = [[UITapGestureRecognizer alloc] initWithTarget:self action:@selector(myTapMethod)];
[myImageView setUserInteractionEnabled:YES];
[myImageView addGestureRecognizer:newTap];
-(void)myTapMethod{
// treat image tap
}
semoga membantu.
Anda juga dapat menambahkan UIGestureRecognizer. Ini tidak mengharuskan Anda untuk menambahkan elemen tambahan dalam hierarki tampilan Anda, tetapi tetap memberi Anda semua kode yang ditulis dengan baik untuk menangani kejadian sentuh dengan antarmuka yang cukup sederhana:
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];
Saya telah berada di utas yang berbeda dalam beberapa jam terakhir mencoba menemukan solusi untuk masalah saya, tetapi tidak berhasil. Saya melihat banyak pengembang berbagi masalah ini, dan saya pikir orang-orang di sini tahu tentang ini. Saya memiliki banyak gambar di dalam UIScrollView
, mencoba untuk mendapatkan peristiwa tap di dalamnya.
tidak mendapatkan acara apa pun dari UIImangeView
, tetapi saya mendapatkan acara dari serupa UILable
dengan parameter yang sangat mirip yang saya tetapkan untuk itu. di bawah IOS 5.1.
Saya telah melakukan hal berikut:
UIImageView
.UIImageView
, tidak membantu apapun.Melampirkan beberapa kode di bawah ini, dalam kode ini saya menginisialisasi a UIImageView
dan UILabel
, label berfungsi dengan baik dalam hal peristiwa pengaktifan. Saya mencoba menyembunyikan kode yang tidak relevan. Terima kasih teman-teman, 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;
Dan metode yang menangani acara tersebut:
- (void)singleTapGestureCaptured:(UITapGestureRecognizer *)gesture
{
UIView *tappedView = [gesture.view hitTest:[gesture locationInView:gesture.view] withEvent:nil];
NSLog(@"Touch event on view: %@",[tappedView class]);
}
Seperti yang dikatakan, keran label diterima.
Alih-alih membuat UIImageView yang bisa disentuh lalu menempatkannya di navbar, Anda sebaiknya membuat UIBarButtonItem, yang Anda buat dari UIImageView.
Pertama buat tampilan gambar:
UIImageView *yourImageView = [[UIImageView alloc] initWithImage:[UIImage imageNamed:@"nameOfYourImage.png"]];
Kemudian buat item barbutton dari tampilan gambar Anda:
UIBarButtonItem *yourBarButtonItem = [[UIBarButtonItem alloc] initWithCustomView:yourImageView];
Kemudian tambahkan item tombol bar ke bar navigasi Anda:
self.navigationItem.rightBarButtonItem = yourBarButtonItem;
Ingatlah bahwa kode ini masuk ke pengontrol tampilan yang ada di dalam larik pengontrol tampilan pengontrol navigasi. Jadi pada dasarnya, "item tombol bilah yang tampak seperti gambar yang dapat disentuh" ini hanya akan muncul di bilah navigasi saat pengontrol tampilan ini saat ditampilkan. Saat Anda menekan pengontrol tampilan lain, item tombol bilah navigasi ini akan hilang ~
Apa yang mungkin ingin Anda lakukan adalah mengganti touchesBegan:withEvent:
metode UIView
(atau subclass) yang berisi UIImageView
subview Anda .
Dalam metode ini, uji apakah ada UITouch
sentuhan yang berada di dalam batas UIImageView
instance (katakanlah disebut imageView
).
Artinya, apakah CGPoint
elemen tersebut [touch locationInView]
bersinggungan dengan CGRect
elemen [imageView bounds]
? Perhatikan fungsi CGRectContainsPoint
untuk menjalankan pengujian ini.
Bagi Anda yang mencari solusi Swift 4 untuk jawaban ini. Anda dapat menggunakan berikut ini untuk mendeteksi kejadian sentuh di UIImageView.
let gestureRecognizer: UITapGestureRecognizer = UITapGestureRecognizer(target: self, action: #selector(imageViewTapped))
imageView.addGestureRecognizer(gestureRecognizer)
imageView.isUserInteractionEnabled = true
Anda kemudian perlu menentukan pemilih Anda sebagai berikut:
@objc func imageViewTapped() {
// Image has been tapped
}
Tambahkan gestur pada view tersebut. Tambahkan image ke view tersebut maka gesture tersebut akan mendeteksi gesture pada image juga. Bisakah Anda coba dengan metode delegate event sentuh maka dalam hal itu juga mungkin terdeteksi. Terima kasih