programing

UIGesture Recognizer를 여러 뷰에 첨부할 수 있습니까?

topblog 2023. 7. 2. 18:57
반응형

UIGesture Recognizer를 여러 뷰에 첨부할 수 있습니까?

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자산이 제공합니다.

보다

제스처 인식기가 부착된 보기(읽기 전용)

@속성(비원자, 읽기 전용) UIView *보기

토론 제스처 인식기 추가 방법을 사용하여 제스처 인식기를 UIView 개체에 첨부(또는 추가)합니다.

저는 아래를 사용하여 그것을 극복했습니다.

for (UIButton *aButton in myButtons) {

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

}

그런 다음 내 핸들 LongPress 메서드에서 나는 제스처 인식기의 보기와 동일한 UI 버튼을 설정하고 그 버튼을 기반으로 내가 수행하는 작업을 분기합니다.

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

스위프트 3의 경우, 위의 바빅 래소드 답변을 기반으로 합니다.

 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())

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

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

보기에 첨부된 제스처 인식자

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

iOS용 이벤트 처리 가이드 - 제스처 인식기 Apple 개발자 라이브러리

다른 사람들이 언급한 것처럼 일부 경우에는 작동할 수 있지만, 이는 분명히 설명서에 위배되며 향후 iOS 버전에서 변경될 수 있습니다.

모니터링할 보기에 별도의 제스처 인식기를 추가하여 공통 동작을 공유할 수 있습니다.

우리가 뭔가를 할 수 있어요. 이렇게, 쉽고 간단합니다.

컨트롤러에 아래와 같이 함수를 만듭니다(이 함수는 제스처 인식기를 반환합니다).

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

이제 다중 뷰에서 이 인식기를 설정합니다.

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

kwalker가 위에서 답변한 것처럼 여러 버튼에 제스처 보기를 추가하기 위해 코드화하고 싶지 않은 사용자가 인터페이스 빌더를 통해 이를 수행하기를 원한다면 도움이 될 수 있습니다.

UIButtons 및 UILabels와 같은 다른 개체를 추가하는 것처럼 개체 라이브러리에서 Long Press gesture Recognizer를 추가할 수 있습니다.

enter image description here처음에 제가 사용하게 된 것은 하나만 사용한 것입니다.

에 대한 참조 설정UIButton파일 소유자와 함께 작업을 보냈습니다.

enter image description here

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

만약 당신이 고정된 견해를 가지고 있다면, 저는 당신이 이런 것을 하는 것을 제안합니다.

[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)

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

로 재정의합니다.<UIScrollViewDelegate>'

그리고 .m 클래스에서 다음 방법을 사용합니다.

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

이 방법은 단일 보기에서 다중 스와이프를 활성화하는 데 도움이 됩니다.

제스처 다시 쓰기(다시 만들기) 동일한 기능을 가리키는 제스처 인식기를 추가할 때마다 인식합니다.아래의 경우 작동합니다.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")
}

이것이 오래된 게시물인 것은 알지만 비슷한 것을 발견했고 다른 누군가에게 유용하기를 바랍니다.저는 단순히 제 imageView를 배열에 저장하고 각 imageView를 설정하는 기능으로 동일한 제스처 인식기에 할당했습니다.

내가 보기에 DidLoad():

imageViewList = [imageView, imageView2, imageView3]
setupImageViews(imageViews: imageViewList)

영상 보기를 설정하는 기능:

func setupImageViews(imageViews: [UIImageView]) {
    
    for imageView in imageViews {
        let tapGestureRecognizer = UITapGestureRecognizer(target: self, action: #selector(imageTapped(tapGestureRecognizer:)))
        imageView.isUserInteractionEnabled = true
        imageView.addGestureRecognizer(tapGestureRecognizer)
        
        //set up image to be displayed with the right aspect
        imageView.autoresizingMask = [.flexibleWidth, .flexibleHeight, .flexibleBottomMargin, .flexibleRightMargin, .flexibleLeftMargin, .flexibleTopMargin]
        imageView.contentMode = .scaleAspectFit // OR .scaleAspectFill
        imageView.clipsToBounds = true
    }
}

또한 작업 선택기 image Taped()에서는 어떤 영상 보기를 탭하든 해당 코드를 가질 수 있습니다.

@objc func imageTapped(tapGestureRecognizer: UITapGestureRecognizer)
{
    switch tapGestureRecognizer.view {
    case imageView:
        print("tapped Image View 1") //add your actions here
    case imageView2:
        print("tapped Image View 2") //add your actions here
    case imageView3:
        print("tapped Image View 3") //add your actions here
    default:
        print("Tap not detected")
    }
    _ = tapGestureRecognizer.view as! UIImageView
    //additional code...
}

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

반응형