SORU
2 AĞUSTOS 2012, PERŞEMBE


Superview kullanarak kendi hitTest çerçevesi dışında bir küme üzerinde dokunur yakalama:withEvent:

Benim sorunum:Ben bir superview EditView Bu kaplar temelde tüm uygulama çerçeve, ve bir küme MenuView alır sadece alt ~20%, ve daha sonra MenuView içerir kendi küme ButtonView aslında bulunduğu dışında MenuView'nın sınırları (gibi bir şey bu: ButtonView.frame.origin.y = -100).

(not: EditView MenuView'In hiyerarşi görünümü, ama cevabı etkileyebilir.) bir parçası olmayan diğer subviews vardır

Bildiğiniz konu: ButtonView içinde sınırları MenuView (ya da, daha doğrusu, ne zaman dokunur içinde MenuView'nın sınırları), ButtonView yanıtlar için dokunmatik olayları. Değişikliklerimi MenuViewdışında'nin sınırları ButtonView'nın sınırları), hayır dokunma olayı ButtonView tarafından alındı. içinde (ama hala ne zaman

Örnek:

  • (E) EditView, tüm görünümler üst
  • (M) MenuView, EditView . bir alt görünümüdür
  • (B) ButtonView, MenuView . bir küme

Diyagram:

 ------------------------------ 
|E                             |
|                              |
|                              |
|                              |
|                              |
| -----                        |
||B    |                       |
| -----                        |
| ---------------------------- |
||M                           ||
||                            ||
| ---------------------------- |
 ------------------------------ 

Çünkü (B) dışında (M)'nin çerçeve, bir dokunun (B) bölge asla gönderilen (M) - aslında, (M) hiç analiz touch bu durumda, dokunuşu gönderilir bir sonraki nesne hiyerarşisi.

Amaç:hitTest:withEvent: geçersiz kılma bu sorunu çözebilir sanırım, ama tam olarak nasıl anlamıyorum. Benim durumumda, hitTest:withEvent: EditView geçersiz ('master' superview)? Veya MenuView, dokunur almadığını düğmesine doğrudan superview geçersiz olmalıdır? Ya da bu konuda yanlış düşünüyorum?

Eğer bu uzun bir açıklama gerektirir, iyi bir online kaynak - bunu bana açıkça belirtmiş olan Apple'ın UİView docs dışında yararlı olacaktır.

Teşekkürler!

CEVAP
14 ŞUBAT 2013, PERŞEMBE


Ben modifiye kabul edilen cevap bu kod daha genel - işleme durumlarda görüyor klibi subviews için kendi sınırları, gizli olabilir, ve daha önemlisi : eğer subviews olduğu karmaşık görünüm hiyerarşileri, doğru küme iade edilecek.

- (UIView *)hitTest:(CGPoint)point withEvent:(UIEvent *)event
{   
    if (!self.clipsToBounds && !self.hidden && self.alpha > 0) {
        for (UIView *subview in self.subviews.reverseObjectEnumerator) {
            CGPoint subPoint = [subview convertPoint:point fromView:self];
            UIView *result = [subview hitTest:subPoint withEvent:event];
            if (result != nil) {
                return result;
            }
        }
    }

    return nil;
}

Bu herkes için daha karmaşık durumlarda kullanmak için bu çözümü kullanmaya yardımcı olur umarım.

Bunu Paylaş:
  • Google+
  • E-Posta
Etiketler:

YORUMLAR

SPONSOR VİDEO

Rastgele Yazarlar

  • Blunty

    Blunty

    13 Mart 2006
  • Rachel Raum

    Rachel Raum

    10 EYLÜL 2007
  • tsweeney79

    tsweeney79

    21 Ocak 2008