[ios] UIGestureRecognizer를 여러보기에 연결할 수 있습니까?

UITapGestureRecognizer *tapGesture = [[UITapGestureRecognizer alloc] initWithTarget:self action:@selector(tapTapTap:)];
[self.view1 addGestureRecognizer:tapGesture];
[self.view2 addGestureRecognizer:tapGesture];
[tapGesture release];

위의 코드에서는 탭만 view2인식됩니다. 세 번째 줄을 주석 처리하면 탭 view1이 인식됩니다. 내가 옳고 제스처 인식기를 한 번만 사용할 수 있다면 이것이 버그인지 확실하지 않거나 더 많은 문서가 필요합니다.



답변

A UIGestureRecognizer는 단일 뷰와 함께 사용됩니다. 문서가 드물다는 데 동의합니다. 그것은 UIGestureRecognizer하나의 view속성을 가지고 있습니다 :

전망

제스처 인식기가 연결된보기입니다. (읽기 전용)

@property (비 원자, 읽기 전용) UIView * view

토론 addGestureRecognizer : 메소드를 사용하여 제스처 인식기를 UIView 객체에 첨부 (또는 추가)합니다.


답변

아래를 사용하여 문제를 해결했습니다.

for (UIButton *aButton in myButtons) {

            UILongPressGestureRecognizer *longPress = [[UILongPressGestureRecognizer alloc] initWithTarget:self action:@selector(handleLongPress:)];
            longPress.minimumPressDuration=1.0;
            [aButton addGestureRecognizer:longPress];
            [longPress release];

}

그런 다음 handleLongPress 메서드에서 제스처 인식기의 뷰와 동일한 UIButton을 설정하고 해당 버튼을 기반으로 수행하는 작업을 분기합니다.

- (void)handleLongPress:(UILongPressGestureRecognizer*)gesture {
    if ( gesture.state == UIGestureRecognizerStateEnded ) {
        UIButton *whichButton=(UIButton *)[gesture view];
        selectedButton=(UIButton *)[gesture view];
    ....
}


답변

누군가가 이것을 요구하는 경우 Swift 3의 경우 : 위의 Bhavik Rathod Answer에 근거합니다.

 func setGestureRecognizer() -> UIPanGestureRecognizer {

        var panRecognizer = UIPanGestureRecognizer()

        panRecognizer = UIPanGestureRecognizer (target: self, action: #selector(pan(panGesture:)))
        panRecognizer.minimumNumberOfTouches = 1
        panRecognizer.maximumNumberOfTouches = 1
        return panRecognizer
    }

        ///set the recognize in multiple views
        view1.addGestureRecognizer(setGestureRecognizer())
        view2.addGestureRecognizer(setGestureRecognizer())


답변

우리는 무언가를 할 수 있습니다. 이렇게 쉽고 간단합니다

1) 컨트롤러에서 아래와 같이 함수를 만듭니다 (이 함수는 GestureRecognizer를 반환합니다)

-(UITapGestureRecognizer*)setRecognizer{
     UITapGestureRecognizer *gestureRecognizer = [[UITapGestureRecognizer alloc] initWithTarget:self action:@selector(openProfile)];
     [gestureRecognizer setNumberOfTapsRequired:1];
     return gestureRecognizer;
}

2) 이제이 인식기를 여러보기로 설정하십시오.

[self.view1 addGestureRecognizer:[self setRecognizer]];
[self.view2 addGestureRecognizer:[self setRecognizer]];


답변

아니오. 제스처 인식기를 둘 이상의보기에 첨부해서는 안됩니다.

Apple 문서에는 다음과 같은 명시적인 정보가 있습니다.

제스처 인식기가 뷰에 연결됩니다

모든 제스처 인식기는 하나의 뷰와 연결됩니다. 반대로, 하나의보기가 여러 가지 다른 제스처에 응답 할 수 있으므로보기에는 여러 개의 제스처 인식기가있을 수 있습니다. 제스처 인식기가 특정보기에서 발생하는 터치를 인식하려면 제스처 인식기를 해당보기에 연결해야합니다.

iOS 용 이벤트 처리 안내서-제스처 인식기 Apple Developer Library

다른 사람들이 언급했듯이 그들은 경우에 따라 작동 할 수 있지만 문서와 분명히 반대이며 향후 iOS 버전에서 변경 될 수 있습니다.

수행 할 수있는 작업은 모니터링하려는보기에 별도의 제스처 인식기를 추가하고 공통 동작을 공유 할 수 있다는 것입니다.


답변

kwalker 와 같은 여러 버튼에 대한 제스처보기를 추가하기 위해 코드를 작성하지 않으려면 Interface Builder를 통해 수행하려는 경우 도움이 될 수 있습니다.

1) UIButton 및 UILabels와 같은 다른 객체를 추가하는 것처럼 객체 라이브러리에서 Long Press 제스처 인식기를 추가 할 수 있습니다.

여기에 이미지 설명을 입력하십시오
처음에 내가 사용한 것은 하나만 가져갔습니다.

2) 참조 아웃렛을 설정 UIButton하고 파일 소유자와 조치를 보냄.

여기에 이미지 설명을 입력하십시오

참고 : UIButton 또는 다른 객체가 여러 개인 경우 각각에 대해 별도의 제스처 인식기가 필요합니다. 자세한 내용은이 질문을 참조하십시오. 길게 누르기 제스처 인식기에서 잘못된 UIButton 태그 가져 오기


답변

당신이 고정보기를 가지고 있다면 나는 당신이 이와 같은 일을 할 것을 제안합니다

[self.view1 addGestureRecognizer:[[UITapGestureRecognizer alloc] initWithTarget:self action:@selector(tapTapTap:)]];
[self.view2 addGestureRecognizer:[[UITapGestureRecognizer alloc] initWithTarget:self action:@selector(tapTapTap:)]];

그렇게하면 여러 가지 다른 쓸모없는 변수가 줄어 듭니다.