아래에 있는 UIView에 터치 전달
나는 있습니다UIView
4개의 버튼이 있고 또 다른 버튼이 있습니다.UIView
버튼 보기의 맨 위에 있습니다.맨 위에 있는 보기에 다음이 포함됩니다.UIImageView
UITapGestureRecognizer
그 위에
내가 만들려고 하는 행동은 사용자가 다음을 탭할 때입니다.UIImageView
화면의 오른쪽 하단 모서리에 있는 작은 것과 애니메이션을 사용하여 큰 것 사이를 전환합니다.크기가 크면 아래쪽 보기의 버튼을 비활성화하고 크기가 작으면 오른쪽 아래 구석에 있는 버튼으로 터치가 전달되어 정상적으로 작동하기를 원합니다.는 거의 다 버튼을 .UserInteractions
내 안에 이것이 있습니다.initWithFrame:
위뷰의: 예:
// Add a gesture recognizer to the image view
UITapGestureRecognizer *tapGestureRecognizer = [[UITapGestureRecognizer alloc] initWithTarget:self action:@selector(imageTapped:)];
tapGestureRecognizer.cancelsTouchesInView = NO;
[imageView addGestureRecognizer:tapGestureRecognizer];
[tapGestureRecognizer release];
는 제 그리나는입니다.imageTapped:
방법:
- (void) imageTapped:(UITapGestureRecognizer *) gestureRecognizer {
// Toggle between expanding and contracting the image
if (expanded) {
[self contractAnimated:YES];
expanded = NO;
gestureRecognizer.cancelsTouchesInView = NO;
self.userInteractionEnabled = NO;
self.exclusiveTouch = NO;
}
else {
[self expandAnimated:YES];
expanded = YES;
gestureRecognizer.cancelsTouchesInView = NO;
self.userInteractionEnabled = YES;
self.exclusiveTouch = YES;
}
}
위의 코드를 사용하면 이미지가 크면 버튼이 비활성화되고 이미지를 터치하면 축소되고 버튼이 활성화됩니다.그러나 작은 이미지는 터치를 받지 못해 확대되지 않습니다.
가 면하정으로 하면,self.userInteractionEnabled = YES
두 경우 모두 터치하면 이미지가 확장되고 수축되지만 버튼은 터치를 수신하지 않고 비활성화된 것처럼 작동합니다.
이미지가 수축된 상태일 때 이미지가 확장되고 수축되지만 아래 버튼은 이미지가 수축된 상태일 때만 터치를 받을 수 있는 방법이 있습니까?내가 여기서 멍청한 짓을 하고 있고 명백한 것을 놓치고 있는 건가요?
어떤 도움이든 감사하게 생각하도록 이 일을 성공시키려고 노력하는 것은 정말 미친 짓입니다.
데이브
업데이트:
▁thero를 오버로딩했습니다.touchesBegan:
그리고.touchesCancelled:
UIImageView가 포함된 내 뷰에서 메서드와 슈퍼 구현을 호출했습니다.로 위의코드함께와,함께,touchesCancelled:
호되지않며으출며▁is▁the않으▁called▁and.touchesBegan:
항상 호출됩니다.
따라서 보기가 터치를 받고 있는 것처럼 보이지만 아래 보기로 전달되지는 않습니다.
갱신하다
이것은 응답자 체인이 작동하는 방식 때문입니까?내 보기 계층은 다음과 같습니다.
VC - View1
-View2
-imageView1 (has tapGestureRecogniser)
-imageView2
-View3
-button1
-button2
내 생각에 OS는 먼저 View2가 앞에 있으니 터치를 모두 받아야 하며 사용자가 아니면 View3로 전달되지 않습니다.View2의 경우 Interactions(상호 작용)가 NO(아니오)로 설정되어 있으며, 이 경우 imageView1도 터치를 수신할 수 없습니다.이것이 작동 방식이며 View2가 View3의 터치를 통과할 수 있는 방법이 있습니까?
UIGesture Recognizer는 제가 생각하는 빨간 청어입니다.결국 이 문제를 해결하기 위해 저는 오버로드했습니다.pointInside:withEvent:
나의 방법UIView:
- (BOOL)pointInside:(CGPoint)point withEvent:(UIEvent *)event {
BOOL pointInside = NO;
if (CGRectContainsPoint(imageView.frame, point) || expanded) pointInside = YES;
return pointInside;
}
따라서 imageView를 누르거나 확장 플래그가 설정된 경우 뷰가 모든 터치를 트랩합니다.확장되지 않은 경우 터치가 이미지 보기에 있는 경우에만 트랩합니다.
최상위 수준 VC의 View는 NO를 반환하여 나머지 뷰 계층에 조회하여 히트를 찾습니다.
다음 항목을 선택View
에Storyboard
또는XIB
그리고...
또는 스위프트에서 스위프트
view.isUserInteractionEnabled = false
UIGesture Recognizer 딜러 프로토콜을 살펴봅니다.구체적으로.gestureRecognizer:shouldReceiveTouch:
당신은 각각을 만들고 싶을 것입니다.UIGestureRecognizer
당신의 재산UIViewController
,
// .h
@property (nonatomic, strong) UITapGestureRecognizer *lowerTap;
// .m
@synthesize lowerTap;
// When you are adding the gesture recognizer to the image view
self.lowerTap = tapGestureRecognizer
다음을 수행해야 합니다.UIViewController
대표자,
[self.lowerTap setDelegate: self];
그러면 이런 거 있잖아요.
- (BOOL)gestureRecognizer:(UIGestureRecognizer *)gestureRecognizer shouldReceiveTouch:(UITouch *)touch {
if (expanded && gestureRecognizer == self.lowerTap) {
return NO;
}
else {
return YES;
}
}
물론, 이것은 정확한 코드가 아닙니다.하지만 이것이 여러분이 따르고 싶은 일반적인 패턴입니다.
다른 해결책이 있습니다.나는 두 가지 견해가 있습니다, 그들을 부르죠.CustomSubView
둘 다 감촉을 받아야 합니다그래서 저는 뷰 컨트롤러와 사용자 정의 UIView 클래스를 가지고 있습니다.ViewControllerView
인터페이스 작성기에 설정한 다음 해당 보기에 터치를 수신해야 하는 두 개의 보기를 추가했습니다.
그래서 제가 감청을 했습니다.ViewControllerView
히트를 덮어씀으로써 테스트:
- (UIView *)hitTest:(CGPoint)point withEvent:(UIEvent *)event
{
return self;
}
그 다음에 제가 글을 남겼습니다.ViewControllerView
:
- (void)touchesBegan:(NSSet *)touches
withEvent:(UIEvent *)event
{
[super touchesBegan:touches withEvent:event];
for (UIView *subview in [self.subviews reverseObjectEnumerator])
{
if ([subview isKindOfClass:[CustomSubView class]])
{
[subview touchesBegan:touches withEvent:event];
}
}
}
에도 동일한 작업 수행touchesMoved
touchesEnded
그리고.touchesCancelled
.
@Magic Bullet Dave의 솔루션이지만 Swift에 있습니다.
스위프트 3
override func point(inside point: CGPoint, with event: UIEvent?) -> Bool {
var pointInside = false
if commentTextField.frame.contains(point) {
pointInside = true
} else {
commentTextField.resignFirstResponder()
}
return pointInside
}
사용자가 새 사진을 찍는 동안 댓글을 달 수 있는 기능을 제공하기 위해 ImagePickerViewController용 CameraOverlayView에서 사용합니다.
언급URL : https://stackoverflow.com/questions/9026097/passing-through-touches-to-uiviews-underneath
'sourcecode' 카테고리의 다른 글
개미매처() 대 개미매처()의 스프링 보안 적용 (0) | 2023.08.02 |
---|---|
이클립스에 아티팩트 com.oracle:ojdbc7이 없습니다. (0) | 2023.08.02 |
JPA Spring Boot를 통해 AWS Athena 액세스 (0) | 2023.07.28 |
오리진 http://localhost는 액세스-제어-허용-오리진에서 허용되지 않습니다. (0) | 2023.07.28 |
그리드 레이아웃(GridView 아님) 모든 어린이를 고르게 스트레칭하는 방법 (0) | 2023.07.28 |