Bir UIImageView'ın dokunma olayını nasıl tespit edebilirim?


Yanıtlar:


138

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.


Gezinme çubuğuna bir düğme ekledim ve dokunma olaylarını da idare edebiliyorum. Ancak bu butona yuvarlak bir resim eklemek istiyorum. Bunu programlı olarak nasıl yapabileceğimi bana bildirir misiniz? Ayrıca, düğme özelliğini programlı olarak "özel" olarak nasıl ayarlayabileceğimi bana bildirir misiniz?
ebaccount

UIButton için dokümanlara bakın - bir kontrol durumu için arka plan resimleri ayarlamanız gerekir, Normal ve Seçili / Vurgulu için farklı resimler isteyeceksiniz. Düğme stili, UIButtonStyleCustom olarak ayarladığınız şeydir, inanıyorum ki, UIButton'daki stil özelliği için dokümanlara tekrar bakın.
Kendall Helmstetter Gelner

1
UIImageView üst kısmına bir UIB düğmesi eklemek biraz fazla değil mi? Fazladan bir nesne ekliyorsunuz, halbuki zaten var olan UIImageView nesnesinin dokunma yöntemlerini uygulayabilirsiniz. Hayır?
samvermette

32
Bellekteki bir UIB düğmesinin boyutuna bakarsanız, neredeyse hiçbir şey değildir ve ekran başına yalnızca birkaç tanesine sahip olursunuz. Ücretsiz olarak aldığınız şey, farklı durumlar için tüm hedef eylem kabloları (içeride dokunmak gibi) ve ayrıca bastırdığınızda tetiklememek, ancak parmağınızı yana kaydırmak gibi hoş davranışlardır. Temel olarak düğmeler, tüm sistemdeki en ince işlenmiş nesnelerden biridir ve daha iyi çalışan özel dokunmatik kod yapacağınızı düşünmek deliliktir. Ucuz olan ve iyi çalışan bir şey kullanın, özel çalışmayı çerçevelerin sizin için halihazırda işlemediği şeyler için kaydedin.
Kendall Helmstetter Gelner

6
İhtiyacınız olan tek şey dokunma olayları ise (addTaget: action: forControlEvents aracılığıyla :) bir UIControl'ün üzerine de bindirebilirsiniz. Görüntüleri ve birkaç durumu olan bir UIButton'dan biraz daha ucuzdur. Ayrıca, bindirilmiş denetimin arka plan rengini pembeye değiştirmek için önişlemci koşullarını kullanıyorum, böylece tam olarak nerede olduklarını görebilirim (ve var olduklarını hatırlayabilir :-).
Jeff

115

A UIImageView, türetilen a'dan UIViewtüretilmiştir, UIResponderbu nedenle dokunma olaylarını işlemeye hazırdır. Sen sağlamak isteyeceksiniz touchesBegan, touchesMovedve touchesEndedyö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:

  • canBecomeFirstResponderGö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 UIViewsEVET'tir, ancak için HAYIR'dır, UIImageViewsbu 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 .


Bunu denedim ama asla daha az dokunuşları almadımBegan olayları ... neden bu?
Markus

5
@Markus: Aynı sorunu yaşadım, ancak userInteractionEnabledebeveyn görünümümde EVET olarak ayarlayarak çözdüm . Stackoverflow.com/questions/5887305/… sayfasına
Saxon Druce

51

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
}

userInteractionEnabled = true unutması kolay kısımdır, teşekkürler.
Michael Peterson

23

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];

10
İmgView_
Anonymous White

13

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 UIImangeViewbir 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:

  1. hem UIImageView hem de üst görünüm için setUserInteractionEnabled değerini YES olarak ayarlayın.
  2. setMultipleTouchEnabled'ı YES olarak ayarlayın UIImageView.
  3. Alt sınıflandırma denendi UIImageView, hiçbirine yardımcı olmadı.

Aşağıda bazı kod ekleme, bu kodda ben hem a başlatmak UIImageViewve UILabeletiket 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.


6

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.


3

Alt görünümünüzü içeren (veya alt sınıfın) touchesBegan:withEvent:yöntemini geçersiz kılmak isteyebilirsiniz.UIViewUIImageView

Bu yöntem dahilinde, UITouchdokunuşlardan herhangi birinin UIImageViewörneğin sınırları içine girip girmediğini test edin (diyelim ki denir imageView).

Olduğunu, yaptığı CGPointelemanı [touch locationInView]ile birlikte Intersect CGRectelemanı [imageView bounds]? CGRectContainsPointBu testi çalıştırmak için işleve bakın .


Cevabın için teşekkürler. Görünümü şu şekilde ekledim: [navBar addSubview: self.pImage]; // gezinme çubuğunun bir alt görünümü olarak eklendi. Fonksiyonu geçersiz kıldım ama fonksiyon asla çağrılmıyor. UIImageView öğesinin userInteractionEnabled özelliğini YES olarak ayarladım. Bir şey kaçırıyor muyum?
ebaccount

TouchesBegan: withEvent: method'a göz atın. Arama motorlarında bunun nasıl çalıştığına dair birçok örnek var.
Alex Reynolds

1

Ö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.


0

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
}

-2

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.

Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.