2010-12-12 7 views
5

을 사용하여 aSubview의 위치를 ​​수퍼 뷰와 관련하여 이동합니다. 슈퍼 뷰는 서브 뷰 자체보다 크지 않습니다. 다음 코드와 같이이 할 매우 간단하지 않습니다하십시오 aSubview가 이동되면 touchesBegan이 뷰가 슈퍼 뷰 외부로 이동하면 작동하지 않습니다.

UITouch* touch = [touches anyObject]; 
    CGPoint touchPoint = [touch locationInView:[self superview]]; 
    self.center = touchPoint; 

그러나, 곧 그 일부가 슈퍼 뷰의 경계를 벗어나으로, 더 이상 등록 할 해당 섹션에 감동. 즉, touchesBegan은 더 이상 발화하지 않습니다. aSubview에 연락하여 수퍼 뷰와 관련하여 어디로 이동했는지에 관계없이 등록하고 싶습니다.

의견이 있으십니까?
하워드

답변

0

이것이 올바른 방법인지는 확실하지 않지만 확실히 한 가지 방법입니다.

부모님의 물건을 만지는 것. 이벤트를 받으면 touchesBegan을 호출하여 차일드 뷰에 이벤트를 전달하십시오.

+0

내가 히트가 자녀의보기 또는 아니 었 여부를 결정하는 방법을 파악해야 할 것 때문에 (그렇게하지 않으 :

대신에, 하나는 더 잘 체크 할 필요가 그것은 틀림없이 어렵지는 않지만, 그렇게 할 필요는 없다). 실제로는 그보다 조금 더 나쁩니다. 여러 가지 하위 뷰를 가지므로 어떤 뷰가 조회되었는지 결정해야합니다. 그것은 필자가 필요하지 않다고 생각하는 합병증을 일으킨다. – hkatz

1

저는 Apple 엔지니어에게이 문제에 관해 이야기했습니다. touchesBegan은 슈퍼 뷰에서 포함되지 않은 서브 뷰 부분에서는 작동하지 않습니다. 서브 뷰가 호출 될 때 서브 뷰를 결정하려고 할 때 시스템이 각 서브 뷰를 계층 구조 아래로 클립하기 때문입니다.

이 문제를 해결하기 위해 클리핑 문제의 원인이되는 중간 래퍼보기를 제거하고 하위보기를 한 단계 위로 올렸습니다. 이로 인해 로직이 약간 변경되었지만 궁극적으로 더 깨끗한 솔루션으로 입증되었습니다. 더 중요한 것은 효과가 있었던 것입니다.

2

슈퍼 뷰가 단순히 바운드 외부에있는 서브 뷰의 터치 이벤트를 보내지 않았기 때문에 서브 뷰가 입력을받지 못하는 문제가 생겼습니다. 또한 superview의 경계를 그대로 유지하는 것이 중요했으며 계층 구조 위로 하위 뷰를 이동하는 것도 실현 가능하지 않았습니다. 내게 무슨 일이 슈퍼 뷰의 오버 라이딩 이었습니까?

- (BOOL)pointInside:(CGPoint)point withEvent:(UIEvent *)event 

항상 YES를 반환합니다. 결과 : 수퍼 뷰 또는 서브 뷰에서 변경된 내용은 거의 없지만 입력은 superview의 경계 외부에서 수신됩니다.

5

당신이 할 수있는 것을 제외하면, NOT을 만들면 항상 좋은 결과를 얻을 수 있습니다. 이렇게하면보기가 모든 접촉을 가로 챌 것입니다.

- (BOOL)pointInside:(CGPoint)point withEvent:(UIEvent *)event{ 

    return CGRectContainsPoint(self.subviewOutsideMe.frame, point) || CGRectContainsPoint(self.bounds, point); 

} 
+0

사례에 따라, 당신은 또한 'pointInside' 대신에'- (UIView *) hitTest : (CGPoint) point withEvent : (UIEvent *) event'를 오버라이드하는 것을 고려할 수도 있습니다 –

+0

pointInside : 뷰의 서브 뷰가 바깥 쪽이면 하지만 superview의 범위. 권리? – Remover

관련 문제