2010-09-28 20 views
10

A UIScrollView birkaç UIView nesnesi içerir; Ekrandaki bir noktanın dokunuşlar tarafından oluşturulmadığının, kaydırma görünümünün belirli bir alt görünümünde olup olmadığını nasıl anlarım? Şimdiye kadar, alt görümün alt köşede olup olmadığını belirleme çabaları, her zaman ana alt görünümün alt görünümler dizisinde ilk alt görünümü döndürür, yani koordinatlar pencereden değil, kaydırma görünümüne göre değişir.Ekrandaki noktanın belirli UIScrollView alt görünümü içinde olup olmadığını belirlemek

İşte denedim ne (düzenlenmiş)

Eğer nokta penceresine bağlıdır, ve geçerli görünüme onu göreli istiyorum gibi görünüyor
-(UIView *)viewVisibleInScrollView 
{ 
    CGPoint point = CGPointMake(512, 384); 
    for (UIView *myView in theScrollView.subviews) 
    { 
     if(CGRectContainsPoint([myView frame], point)) 
     { 
      NSLog(@"In View"); 
      return myView; 
     } 
    } 
    return nil; 
} 
+0

- (UIView *) viewVisibleInScrollView { \t CGPoint noktası = CGPointMake (512, 384); (TheScrollView.subviews içinde UIView * myview) { \t \t halinde için \t (CGRectContainsPoint ([myview çerçeve], nokta)) { \t \t \t NSLog (@ "adlı içinde"); \t \t \t myView; \t} \t} \t dönüş nil; } – Kyle

cevap

14

. convertPoint:fromView: bu konuda yardımcı olmalıdır.

hataları burada muhtemelen vardır, ancak bu gibi görünmelidir: Bunu kullanmak nasıl

@implementation UIScrollView (FOO) 
- (id)foo_subviewAtPoint:(CGPoint)point 
{ 
    point.x += self.contentOffset.x; 
    for (UIView *subview in self.subviews) { 
     if (CGRectContainsPoint(subview.frame, point)) { 
      return subview; 
     } 
    } 
    return nil; 
} 
@end 

Ve burada:

İşte
-(UIView *)viewVisibleInScrollView 
{ 
    CGPoint point = CGPointMake(512, 384); 
    CGPoint relativePoint = [theScrollView convertPoint:point fromView:nil]; // Using nil converts from the window coordinates. 
    for (UIView *myView in theScrollView.subviews) 
    { 
     if(CGRectContainsPoint([myView frame], relativePoint)) 
     { 
      NSLog(@"In View"); 
      return myView; 
     } 
    } 
    return nil; 
} 
+4

-1. "çerçeve", ebeveynin koordinat alanındadır. Ya -bounds'a karşı karşılaştırmalı ya da bir kez kaydırma görünümünde bulunan koordinat uzayına * ve * -frame'e karşı karşılaştırmalısınız. –

+0

Güzel yakalama. Kodu uygun şekilde ayarlamıştım. –

+0

Bu mükemmel bir şekilde çalıştı. Teşekkürler, çok yakın olduğumu hissettim. – Kyle

2

işim bu

CGPoint center = [scrollView convertPoint:scrollView.center fromView:scrollView.superview]; 
UIView *view = [scrollView foo_subviewAtPoint:center]; 

Not edilmesi gereken bazı şeyler:

  • kaydırma görünümünün koordinat sisteminde ifade edilen , foo_subviewAtPoint:'a iletilen noktadır. Bu yüzden yukarıdaki kodda center'u bu koordinat sistemine süper görüntüden dönüştürmek zorundayım.
  • Mizanpaj kısıtlamaları ile iOS 6.1+ kullanıyorum. Bu kodu hiçbir zaman başka bir şeyle denemedim, bu yüzden YMMV.
İlgili konular