2011-05-04 14 views
42

Bir ebeveyn görünümünde userInteractionEnabled = NO, tüm alt görünümlerde kullanıcı etkileşimini önleyecektir. Bu doğru mu? Bunun etrafında bir yolu var mı?UIView - "kullanıcı etkileşimi etkin", ebeveyn üzerinde yanlış, ancak çocuk için doğru mu?

+4

Evet, durum böyle, ve bu, iOS'ta pek çok şey gibi tamamen aptalca, Apple'ın basit API'lerin yapıldığı günler nerede? Sanırım neredeyse 20 yıl önceydi, şimdi API'ler filozoflar tarafından yazılıyor. –

+4

. . . meşgul olmadıklarında yığın taşması yorumları yazıyorlar. – tooluser

+1

olası yinelemesi [Ebeveyn görünümünde userInteractionEnabled öğesi iOS'ta NO olarak ayarlandığında nasıl dokunulur?] (Http://stackoverflow.com/questions/4661589/how-to-get-touches-when-parent-view-has-userinteractionenabled -set-to-no-in-ios) – DBD

cevap

27

Bu doğru, üst görünümde NO olarak ayarlanmış olan userInteractionEnabled tüm alt görünümlere göre kademeli olarak artacak. Etkileşim etkinleştirmek için bazı alt görüntülemelere ihtiyacınız varsa, ancak başkalarını kullanmıyorsanız, alt görünümlerinizi iki ana görünümde ayırabilirsiniz: biri userInteractionEnabled = YES ve diğeri NO. Ardından bu iki ebeveyn görüşünü ana görünüme yerleştirin.

+1

Teşekkürler lazycs. Benim fikrim, ilgili açılan menü türü görünümlerinin bir avuç düzenini yönetmek için şeffaf bir görünüm kullanmaktı. Ancak görünmez düzen görünümü, altındaki nesnelerle etkileşimi engelliyorsa, bu benim için işe yaramaz. Hrrmmmm .... – morgancodes

+1

Evet, şeffaf görüş fikri bu durumda çalışmayacak. Alt görünümleri doğrudan ana görünüme ekleyebilir misiniz? – lazycs

+0

evet yapabilirdi. Her durumda yarı saydam bir arka plan kullanmak en iyisi olabilir. Hayır biggie. – morgancodes

13

Sen hitTest UIView alt sınıf ve geçersiz kılabilirsiniz: withEvent: bir bakıma belirttiğiniz bir görünümde (_backView) dokunma etkinliklerinin geçmek:

- (UIView *)hitTest:(CGPoint)point withEvent:(UIEvent *)event { 
    UIView *view = [super hitTest:point withEvent:event]; 

    if (view == self) { 
     view = _backView; 
    } 

    return view; 
} 

dokunma olayı bu görünümde o tarafından ele alınması olsaydı "_backView" e iletilir (bu, bir IBOutlet olabilir, böylece arayüz oluşturucu kullanılarak ayarlanabilir); ve eğer herhangi bir çocuk görünümü tarafından ele alınacaksa, o çocuğu ([super hitTest:point withEvent:event];)

sonucunu döndürdüyseniz, bu çözümü olayları iletmek için hangi görüntüye ihtiyacınız olduğunu bildiğiniz kadar iyi olur; Ayrıca mevcut UIView bir alt görünümü olmayan bir görünüm (_backView) dönen beri sorunların olup olmadığını bilmiyorum! ama benim durumumda iyi çalıştı.

Disable touches on UIView background so that buttons on lower views are clickable numaralı belgede belirtilen daha iyi bir çözüm olabilir. -pointInside:withEvent:; Bir önceki çözümle karşılaştırıldığında, olayları almak için bir '_backView' belirtmeniz gerekmedikçe daha iyi olur (etkinlik sadece bir sonraki zincir görünümüne aktarılır)! dezavantajımız tüm alt görünümlerde -pointInside:withEvent:'u gerçekleştirmemiz gerekebileceğidir (

+0

Buradaki yaklaşım ve "Devre dışı bırak ..." bağlantısı için teşekkürler. açıklanan yaklaşım oldukça temiz görünüyor. –

+0

harika bir yaklaşım :) –

+1

hitTest çok geç ... bu en iyi cevap ... http://stackoverflow.com/questions/3427619/disable-touches-on-uiview-background-so-that-buttons-on -düşük-görünümleri-clickabl –

2

Sadece garip bir duruma düştüm. Bir UIBitonun alt görünümünde olan bir UIView'im var (buna V). Bu UIButton, X düğmesini arayın. Aşağıda, X düğmesinin hedefi/seçicisi için kullanacağım yöntem var. Kendim, görünümdür. X Gönderen parametresi X düğmesidir.

Bana sorun oluşturan durumdur. UI'mda başka bir tuşa dokunursam (bu durumda, bu Y düğmesini arayın) ve çok hızlı bir şekilde X düğmesine basın, burada Y eylemi görünümü V'yi devre dışı bırakır, hala dokunma olayını X düğmesine yolladım.

2014-12-19 16: 57: 53,826 BenimUygulamam [6161: 960.615] Burada

- (void) buttonAction: (UIButton *) sender 
{ 
    NSLog(@"superview: %d", sender.superview.userInteractionEnabled); 
    NSLog(@"button itself: %d", sender.userInteractionEnabled); 

    // <snip> 
} 

çıktısı Superview: 0
2014/12/19 16: 57: 53,826 BenimUygulamam [6161: 960615] düğmesine kendisi: 1'dir

, düğme işlemin oluştuğu ve düğmenin Superview kullanıcı etkileşimi devre dışı etmişti! Ve alt görüş hala kullanıcı etkileşimi sağladı!

Bunun yapay olduğunu düşündüğünüz kişiler için, iPad'imde (iOS 8.1.2 çalıştıran), uyguladığımın UI'sinde, uygulamayı kullanmamda bir kaza oluştu. Oluşturmak için çalışıyordum aslında bir şey değildi.

Düşünceler?

Şu anki çözümüm aşağıda verilmiştir, ancak gerekli olması çok garip görünüyor!

- (void) buttonAction: (id) sender 
{ 
    NSLog(@"superview: %d", sender.superview.userInteractionEnabled); 
    NSLog(@"button itself: %d", sender.userInteractionEnabled); 
    if (! self.userInteractionEnabled) return; 

    // <snip> 
} 
0

Bunu "özel uyarı denetleyicim" olan bir xib ile yapıyorum.

İlgili konular