2012-06-04 11 views
19

Bir görüşe dokunulduğunda veya üzerine dokunduğunda, işleyicinin önce arandığını ve sonra onun süper görüntüleyicinin işleyicisini aradığını (yukarı doğru ilerlediğini) düşündüm.iOS'ta, bir süper ekranın userInteractionEnabled öğesi NO ise, tüm alt görünümler de devre dışı bırakılır?

Ancak, superview'in userInteractionEnabled NO değerine ayarlanmış olması durumunda, tüm alt görünümlerin ve yavruların da kullanıcı etkileşimi için devre dışı bırakıldığı doğrudur? Yalnızca ana görünüm için devre dışı bırakmak istiyorsak, ancak alt görünümler için devre dışı bırakmak istemiyorsak ne olur?

+0

Evet doğrudur. – Lefteris

+0

aha, UIResponder'in hangi kuralı ve hangi mekanizmaya neden olduğunu merak ediyordum ... şu anda bile bunu bir "olgu" olarak ezberledim –

cevap

13

Bunu yapamaz,

yerine

aşağıdaki gibi görüşlerin müdürlüğünce değiştirecek:

Main View-> subViews 

Container View -> Main View that you want to set as inactive 
       -> other views that you want to still active 

O halde, şimdiki ana görünümü ve geçerli subviews

dakika süre kardeş olmak, yeni bir konteyner görünümünün çocukları

+0

"Bu" ne "yapamaz"? Sorunun hangi bölümünü kastediyorsunuz? – Honey

18

Eğer bu m Yardımcı olabilirsiniz, bunu iOS 5 Programlamada Matt Neuburg, s. 467: HAYIR olarak ayarlanırsa

userInteractionEnabled

(kendi subviews) ile birlikte bu görünüm alıcı dokunur hariç tutulur. Bu görünümde veya alt görünümlerinden birine dokunanlar, "bir görüntü için değerini" geçerek ".

Dahası, iOS için Kılavuzu Taşıma Apple'ın Olay diyor ki:

pencere nesnesi dokunmatik olayını almak için görünümü bulmak için yakalama testleri ve cevap zincirini kullanır. Vuruş testinde, bir pencere, görüntü hiyerarşisinin en üstteki görünümünde hitTest: withEvent: öğesini çağırır; Bu yöntemi, yinelemeli olarak pointInside: withEvent: her bir görünümünde, YES'i döndüren görünüm hiyerarşisinde, hiyerarşisinde aşağı doğru ilerlerken, dokunuşunun bulunduğu alt görünümü bulana kadar devam eder. Bu görüş hit-test görünümü haline geldi.

ve Matt Neuburg ile programlama IOS 5

, p.485 bir görünüm YES ya da opaklık olarak NO olarak userInteractionEnabled veya hidden işaretlenmişse, sonra görünüşüdür 0'a yakın olan ve Subview geçilen olmayacak bahsedilen HitTest tarafından (ve dolayısıyla herhangi bir dokunuş için dikkate alınmaz).

+1

Kendi 'hitTest: withEvent:' uygulamasını uygulayan kişiler için mükemmel bilgi. Superview düzeyinde 'if (subview.userInteractionEnabled)' seçeneğini kontrol etmem gerekip gerekmediğinden emin değildim, ancak varsayılan uygulama kendi 'userInteractionEnabled' özelliğini kontrol ediyor gibi görünüyor. – darvids0n

+0

, "arkada bir görünüme" ne düşer? "Demek oluyor? Bu, gösterimler olan düğmelerde dokunmanın işe yaramayacağı anlamına mı geliyor? – Honey

1

İlk Yöntem

- (BOOL) gestureRecognizer:(UIGestureRecognizer *)gestureRecognizer shouldReceiveTouch:(UITouch *)touch 
{ 
    if ([touch.view.superview isKindOfClass:[SuperViewParent class]]) return FALSE; 
    return TRUE; 
} 

İkinci Yöntem

UITapGestureRecognizer *r = [[UITapGestureRecognizer alloc] initWithTarget:self action:@selector(agentPickerTapped:)]; 
    r.cancelsTouchesInView = NO; 
    [agentPicker addGestureRecognizer:r]; 
14

manzarayı kendisi görmezden hitTest(_:withEvent:) geçersiz, ama yine de subviews için dokunuşlar teslim edebilir.

class ContainerStackView : UIStackView { 
    override func hitTest(point: CGPoint, withEvent event: UIEvent?) -> UIView? { 
     let result = super.hitTest(point, withEvent: event) 
     if result == self { return nil } 
     return result 
    } 
} 
İlgili konular