Gezinme çubuğuna bir resim (UIImageView) yerleştirdim. Şimdi dokunma olayını algılamak ve olayı ele almak istiyorum. Bunu nasıl yapabilirim?
Gezinme çubuğuna bir resim (UIImageView) yerleştirdim. Şimdi dokunma olayını algılamak ve olayı ele almak istiyorum. Bunu nasıl yapabilirim?
Yanıtlar:
Pratik anlamda, bunu yapmayın.
Bunun yerine, UIImageView üzerine Özel stile sahip bir düğme ekleyin (görüntüleri belirtmediğiniz sürece düğme grafikleri yok). Sonra buna çağrılmasını istediğiniz yöntemleri ekleyin.
Bu tekniği, ekranın bir kısmının Dokunmatik şeylerle uğraşmak yerine bir düğme görevi görmesini gerçekten istediğiniz birçok durumda kullanabilirsiniz.
A UIImageView
, türetilen a'dan UIView
türetilmiştir, UIResponder
bu nedenle dokunma olaylarını işlemeye hazırdır. Sen sağlamak isteyeceksiniz touchesBegan
, touchesMoved
ve touchesEnded
yöntem ve kullanıcı görüntüsünü dokunursa çağrılıp sayfaya. Tek istediğiniz bir dokunma olayı ise, düğme görüntüsü olarak görüntü ayarlanmış özel bir düğme kullanmak daha kolaydır. Ancak, dokunmalar, hareketler vb. Üzerinde daha hassas kontrol istiyorsanız, gidilecek yol budur.
Ayrıca birkaç şeye daha bakmak isteyeceksiniz:
canBecomeFirstResponder
Görünümün dokunma olaylarının odağı olabileceğini belirtmek için geçersiz kılın ve EVET'i döndürün (varsayılan HAYIR'dır).
userInteractionEnabled
Özelliği EVET olarak ayarlayın . Varsayılan değer UIViews
EVET'tir, ancak için HAYIR'dır, UIImageViews
bu nedenle bunu açıkça açmanız gerekir.
Çoklu dokunma olaylarına (örn. Kıstırma, yakınlaştırma vb.) Yanıt vermek istiyorsanız multipleTouchEnabled
, EVET olarak ayarlamak isteyeceksiniz .
userInteractionEnabled
ebeveyn görünümümde EVET olarak ayarlayarak çözdüm . Stackoverflow.com/questions/5887305/… sayfasına
Bir UIImageView'a bir dokunma olayı eklemek için, .m dosyanızda aşağıdakileri kullanın:
UITapGestureRecognizer *newTap = [[UITapGestureRecognizer alloc] initWithTarget:self action:@selector(myTapMethod)];
[myImageView setUserInteractionEnabled:YES];
[myImageView addGestureRecognizer:newTap];
-(void)myTapMethod{
// Treat image tap
}
Ayrıca bir UIGestureRecognizer da ekleyebilirsiniz. Görünüm hiyerarşinize ek bir öğe eklemenizi gerektirmez, ancak yine de oldukça basit bir arayüzle dokunma olaylarını işlemek için tüm güzel yazılmış kodu sağlar:
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];
Son birkaç saattir sorunum için boşuna bir çözüm bulmaya çalışan farklı konulardaydım. Pek çok geliştiricinin bu sorunu paylaştığını görüyorum ve bence buradaki insanlar bunu biliyor. A içinde UIScrollView
, dokunma olaylarını almaya çalışan birden çok resmim var .
Bir'den herhangi UIImangeView
bir olay alamıyorum, ancak buna UILable
çok benzer parametrelere ayarladığım benzer bir olaydan bir olay alıyorum. İOS 5.1 altında.
Aşağıdakileri zaten yaptım:
UIImageView
.UIImageView
, hiçbirine yardımcı olmadı.Aşağıda bazı kod ekleme, bu kodda ben hem a başlatmak UIImageView
ve UILabel
etiket olayları ateş açısından cezası çalışır. Alakasız kodu dışarıda tutmaya çalıştım.
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;
Ve olayı ele alan yöntem:
- (void)singleTapGestureCaptured:(UITapGestureRecognizer *)gesture
{
UIView *tappedView = [gesture.view hitTest:[gesture locationInView:gesture.view] withEvent:nil];
NSLog(@"Touch event on view: %@", [tappedView class]);
}
Söylendiği gibi, etiket musluğu alınır.
Dokunulabilir bir UIImageView yapmak ve ardından onu navbar'a yerleştirmek yerine, sadece bir UIImageView'dan yaptığınız bir UIBarButtonItem oluşturmalısınız.
Önce resim görünümünü yapın:
UIImageView *yourImageView = [[UIImageView alloc] initWithImage:[UIImage imageNamed:@"nameOfYourImage.png"]];
Ardından, barbutton öğesini resim görünümünüzden çıkarın:
UIBarButtonItem *yourBarButtonItem = [[UIBarButtonItem alloc] initWithCustomView:yourImageView];
Ardından, çubuk düğmesi öğesini gezinme çubuğunuza ekleyin:
self.navigationItem.rightBarButtonItem = yourBarButtonItem;
Bu kodun bir gezinti denetleyicisi görünüm denetleyicisi dizisinin içindeki görünüm denetleyicisine gittiğini unutmayın. Yani temel olarak, bu "dokunulabilir resim görünümlü çubuk düğmesi öğesi" yalnızca bu görünüm denetleyicisi gösterildiğinde gezinme çubuğunda görünecektir. Başka bir görünüm denetleyicisine bastığınızda, bu gezinme çubuğu düğmesi öğesi kaybolacaktır.
Alt görünümünüzü içeren (veya alt sınıfın) touchesBegan:withEvent:
yöntemini geçersiz kılmak isteyebilirsiniz.UIView
UIImageView
Bu yöntem dahilinde, UITouch
dokunuşlardan herhangi birinin UIImageView
örneğin sınırları içine girip girmediğini test edin (diyelim ki denir imageView
).
Olduğunu, yaptığı CGPoint
elemanı [touch locationInView]
ile birlikte Intersect CGRect
elemanı [imageView bounds]
? CGRectContainsPoint
Bu testi çalıştırmak için işleve bakın .
Öncelikle, bir UIButton yerleştirmeli ve sonra bu buton için bir arkaplan görüntüsü eklemelisiniz veya butonun üzerine bir UIImageView yerleştirmelisiniz.
Veya:
Dokunma hareketini bir UIImageView'a ekleyebilirsiniz, böylece UIImageView'a dokunduğunuzda tıklama eylemini gerçekleştirebilirsiniz.
Bu cevaba Swift 4 çözümü arayanlar için, UIImageView'da bir dokunma olayını algılamak için aşağıdakileri kullanabilirsiniz.
let gestureRecognizer: UITapGestureRecognizer = UITapGestureRecognizer(target: self, action: #selector(imageViewTapped))
imageView.addGestureRecognizer(gestureRecognizer)
imageView.isUserInteractionEnabled = true
Daha sonra seçicinizi aşağıdaki gibi tanımlamanız gerekecektir:
@objc func imageViewTapped() {
// Image has been tapped
}
Bu görünüme jest ekleyin. Bu görünüme bir görüntü ekleyin ve ardından görüntüde de bir hareket algılayacaktır. Dokunma olayının delege yöntemini deneyebilirsiniz. O zaman bu durumda da tespit ediyor olabilir.