Programing

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

lottogame 2020. 4. 23. 07:37
반응형

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 태그 가져 오기


' <UIScrollViewDelegate>'로 클래스 재정

그리고 .m 클래스 에서이 방법을 사용하십시오 :

- (BOOL)gestureRecognizer:(UIGestureRecognizer *)gestureRecognizer shouldRecognizeSimultaneouslyWithGestureRecognizer:(UIGestureRecognizer *)otherGestureRecognizer{
    return YES;
}

이 방법을 사용하면 단일보기에서 여러 번 스 와이프 할 수 있습니다.


동일한 기능을 가리키는 제스처 인식기를 추가 할 때마다 GestureRecognize를 다시 작성 (재 작성)하는 방법은 무엇입니까? 아래의 경우 작동합니다. IBOutletCollection을 사용하고 있습니다

스위프트 2 :

@IBOutlet var topicView: [UIView]!

override func viewDidLoad() {
        for view in self.topicView as [UIView] {
        view.addGestureRecognizer(UITapGestureRecognizer(target: self, action: "viewClicked:"))
    }
}

func viewClicked(recognizer: UITapGestureRecognizer) {
    print("tap")
}

당신이 고정보기를 가지고 있다면 나는 당신이 이런 식으로하는 것이 좋습니다

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

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


제스처 인식기를 쉽게 추가하기 위해 뷰에서 일반 확장을 만들 수 있습니다. 이것은 단지 예일 뿐이지 만 다음과 같이 보일 수 있습니다

extension UIView {

    func setGestureRecognizer<Gesture: UIGestureRecognizer>(of type: Gesture.Type, target: Any, actionSelector: Selector, swipeDirection: UISwipeGestureRecognizer.Direction? = nil, numOfTaps: Int = 1) {
    let getRecognizer = type.init(target: target, action: actionSelector)

    switch getRecognizer {
    case let swipeGesture as UISwipeGestureRecognizer:
        guard let direction = swipeDirection else { return }
        swipeGesture.direction = direction
        self.addGestureRecognizer(swipeGesture)
    case let tapGesture as UITapGestureRecognizer:
        tapGesture.numberOfTapsRequired = numOfTaps
        self.addGestureRecognizer(tapGesture)
    default:
        self.addGestureRecognizer(getRecognizer)
    }
  }

}

뷰에 2 탭 인식기를 추가하려면 전화하십시오.

let actionSelector = #selector(actionToExecute)
view.setGestureRecognizer(of: UITapGestureRecognizer.self, target: self, actionSelector: actionSelector, numOfTaps: 2)

스 와이프 인식기를 쉽게 추가 할 수도 있습니다.

view.setGestureRecognizer(of: UISwipeGestureRecognizer.self, target: self, actionSelector: actionSelector, swipeDirection: .down)

등등. 대상은 선택기와 연결되어 있어야합니다.


이 코드를 사용하여 xib의 이미지 뷰 인 내보기를 사용할 수 있습니다.

- (void)viewDidLoad
{
    firstIV.tag = 501;
    secondIV.tag = 502;
    thirdIV.tag = 503;
    forthIV.tag = 504;

    [self addTapGesturetoImageView: firstIV];
    [self addTapGesturetoImageView: secondIV];
    [self addTapGesturetoImageView: thirdIV];
    [self addTapGesturetoImageView: forthIV];
}

-(void)addTapGesturetoImageView:(UIImageView*)iv
{
    iv.userInteractionEnabled = YES;
    UITapGestureRecognizer * textfielBGIVTapGasture = [[UITapGestureRecognizer alloc] initWithTarget:self action:@selector(textfielBGIVTapped:)];
    textfielBGIVTapGasture.numberOfTapsRequired = 1;
    [iv addGestureRecognizer:textfielBGIVTapGasture];
}

- (void)textfielBGIVTapped:(UITapGestureRecognizer *)recognizer {
    int tag = recognizer.view.tag-500;
    switch (tag) {
        case 1:
        {
            //firstIV tapped;
            break;
        }
        case 2:
        {
            //secondIV tapped;
            break;
        }
        case 3:
        {
            //thirdIV tapped;
            break;
        }
        case 4:
        {
            //forthIV tapped;
            break;
        }
        default: {
            break;
        }
    }
}

참고 URL : https://stackoverflow.com/questions/4747238/can-you-attach-a-uigesturerecognizer-to-multiple-views

반응형