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 MenuView
dışı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
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.
'' ifadelerini kullanarak iç...
Kullanarak Varlık Çerçevesi ile MySQL...
Doğrulama Sunucu Veritabanı Varlık Çer...
Kullanarak "yeni" bir yapı ü...
Nasıl bir API uygularken blok kendi ke...