2014-05-06 11 views
9

Aşağıdaki kurulumum var.userInteractionEnabled = YES ise touch olayı süper görünüme nasıl geçirir?

+- XXXCustomControl : UIControl -------+ 
| A         | 
| +- ContentView -------------------+| 
| |         || 
| | B        || 
| |         || 
| +---------------------------------+| 
+--------------------------------------+ 

UIControl'ün bir alt sınıfı olan bir XXXCustomControl. Içeriği olarak adlandırılan bir alt görünüm içerir UIView türü denetim alanı daha küçük olan boyutta .. Bu görünüm .userInteractionEnabled = YES;

YES'e ayarlamak için bu özelliğe ihtiyacım var, çünkü yatay kaydırmalar bunun içine bir kez koyuluyor ve kaydırılabilir olması gerekiyor. Superview (bizim durumumuzdaki içerik görünümünde kullanıcı etkileşimine izin verilmezse, bu, alt görünümleri miras alır.) Ancak, aynı zamanda bu XXXCustomControl, yalnızca A bölgesinde değil, içerik görünümünde herhangi bir kaydırma görünümü içermediğinde, dönüştürülebilir olmalıdır. Ben de

1) userInteractionEnabled = içerik görünümünü ayarlamak çünkü aynı zamanda bölge B'de

Onun için burada "çıkar çatışması" var HAYIR, o zaman hem içerik görünüm alanında boş kontrolünü dokunabilirsiniz A ve B'de, ancak kaydırmayacağım kaydırmalar, kaydırılamaz ..

2) içerik görünümünü userInteractionEnabled = YES olarak ayarlayın, ancak eğer Control boşsa Bir dokunma olayını tetiklemek için sadece A bölgesine dokunabilirim.

Buraya geldiğim bir fikir, varsayılan olarak özelliği NO olarak ayarladığım ve içeriği doldurduğumda bunu yes olarak ayarladığımdur. İçeriği temizlediğimde, özelliği no olarak ayarlayın. Temel olarak bunun her zaman evet olarak ayarlanmasını istiyorum ve boş olduğunda, contentView'ı süper görünümüne kadar touchUpInside olayını geçirmeye zorlayın.

Bu mümkün mü?

+1

sadece musluk önem veriyorsan neden eylem var çocuk görünümüne bir gesturerecognizer eklemeyin Ebeveyn görünümünde gesturerecognizer ile aynıdır? Bu en kolay uygulama gibi görünüyor. – Putz1103

+0

Neden bir cevap vermediniz? michaels benim için çalışıyor ... –

+0

Hiç geç olmamasından daha iyi ... –

cevap

13

İç görünümünüzde pointInside:withEvent: yöntemini geçersiz kılmayı deneyebilirsiniz. Bu Superview için rötuşları iletmek istediğinizde HAYIR dönmek izin verir: Eğer subview alt sınıf

-(BOOL)pointInside:(CGPoint)point withEvent:(UIEvent *)event 
{ 
    if(/* You have content, and you want to receive touches */){ 
     return YES; 
    }else{ 
     return NO; 
    } 
} 
+0

Bu, kap (süper) görünümde bazı denetimlerin bulunmasına izin vermek için kap görünümünde bulunan bir görünüm için de iyi çalışır. Sadece alt görüntü kareleriyle etkileşimde bulunun. –

3

ve

- (void)touchesBegan:(NSSet *)touches withEvent:(UIEvent *)event { 
    if (!touchedContent) { 
     [[self nextResponder] touchesBegan:touches withEvent:event]; 
    } else { 
     [super touchesBegan:touches withEvent:event]; 
    } 
} 
0

Başka UIView kullanabilirsiniz uygulamak için "gizlemek" Subview .

* Ayrıntılar: Bu UIView alt görüntünün kardeşidir. alt renginizin açık renkle arka plan rengiyle aynı boyuta ve konuma sahiptir.

* Açıklayın: Yeni UIView dokunuşu alacak ve otomatik olarak süper görüntüye yönlendirecektir.

Bu şekilde alt ekranınızı alt sınıflara ayırmanız gerekmez - bir storyboard çözümü.
Lütfen bunu deneyin. İyi eğlenceler!

0

kullanın bu süper görünümde, (subviews diğer çerçeveler veya bölmelerde de ortaya çıkabilmektedir beri) subviews kodu değiştirmeden:

- (UIView *)hitTest:(CGPoint)point withEvent:(UIEvent *)event 
{ 
    UIView *view = [super hitTest:point withEvent:event]; 
    if ([view isDescendantOfView:self]) 
    { 
     NSLog(@"touched inside"); 
    } 
    return view; 
} 
İlgili konular