[ios] UIImageView의 터치 이벤트를 어떻게 감지 할 수 있습니까?

탐색 모음에 이미지 (UIImageView)를 배치했습니다. 이제 터치 이벤트를 감지하고 이벤트를 처리하고 싶습니다. 어떻게 할 수 있는지 알려 주시겠습니까?

감사.



답변

실제로는 그렇게하지 마십시오.

대신 UIImageView 위에 사용자 정의 스타일 (이미지를 지정하지 않는 한 단추 그래픽 없음)이있는 단추를 추가하십시오. 그런 다음 호출하려는 메서드를 첨부합니다.

화면의 일부 영역이 터치 항목을 엉망으로 만드는 대신 버튼 역할을하려는 많은 경우에이 기술을 사용할 수 있습니다.


답변

A UIImageView는에서 파생 된 a에서 UIView파생 UIResponder되므로 터치 이벤트를 처리 할 준비가되었습니다. 당신은 제공 할 것입니다 touchesBegan, touchesMovedtouchesEnded방법을 사용자가 이미지를 도청 한 경우에는 전화를받을 수 있습니다. 탭 이벤트 만 원하는 경우 이미지가 버튼 이미지로 설정된 사용자 지정 버튼을 사용하는 것이 더 쉽습니다. 그러나 탭, 동작 등을보다 세밀하게 제어하려면 이것이 바로 방법입니다.

또한 몇 가지 더 살펴볼 수 있습니다.

  • canBecomeFirstResponder뷰가 터치 이벤트의 초점이 될 수 있음을 나타내려면 YES를 재정의 하고 반환합니다 (기본값은 NO).

  • userInteractionEnabled속성을 YES로 설정합니다 . 의 기본값 UIViews은 YES이지만 for UIImageViews는 NO이므로 명시 적으로 켜야합니다.

  • 멀티 터치 이벤트 (예 : 핀치, 확대 / 축소 등)에 응답 multipleTouchEnabled하려면 YES 로 설정 해야합니다.


답변

UIImageView에 터치 이벤트를 추가하려면 .m에서 다음을 사용하십시오.

UITapGestureRecognizer *newTap = [[UITapGestureRecognizer alloc] initWithTarget:self action:@selector(myTapMethod)];

[myImageView setUserInteractionEnabled:YES];

[myImageView addGestureRecognizer:newTap];


-(void)myTapMethod{
    // treat image tap
}

도움이 되길 바랍니다.


답변

UIGestureRecognizer를 추가 할 수도 있습니다. 뷰 계층 구조에 추가 요소를 추가 할 필요는 없지만 매우 간단한 인터페이스로 터치 이벤트를 처리하기위한 멋지게 작성된 모든 코드를 제공합니다.

    UISwipeGestureRecognizer *swipeRight = [[UISwipeGestureRecognizer alloc]
                                            initWithTarget:self action:@selector(handleSwipe:)];
    swipeRight.direction = UISwipeGestureRecognizerDirectionRight;
    [imgView_ addGestureRecognizer:swipeRight];
    [swipeRight release];
    UISwipeGestureRecognizer *swipeLeft = [[UISwipeGestureRecognizer alloc]
                                            initWithTarget:self action:@selector(handleSwipe:)];
    swipeLeft.direction = UISwipeGestureRecognizerDirectionLeft;
    [imgView_ addGestureRecognizer:swipeLeft];
    [swipeLeft release];


답변

나는 지난 몇 시간 동안 내 문제에 대한 해결책을 찾으려고 다른 스레드에 있었고 아무 소용이 없었습니다. 많은 개발자들이이 문제를 공유하고 있음을 알고 있으며 여기 사람들이 이에 대해 알고 있다고 생각합니다. 내부에 여러 이미지가 있으며 UIScrollView탭 이벤트를 얻으려고합니다.

에서 이벤트를 UIImangeView얻지 못하지만 UILable설정하는 매우 유사한 매개 변수 를 사용하여 비슷한 이벤트를 얻 습니다. IOS 5.1에서.

이미 다음을 수행했습니다.

  1. `UIImageView 및 상위 뷰 모두에 대해 setUserInteractionEnabled를 YES로 설정하십시오.
  2. 에 대해 setMultipleTouchEnabled를 YES로 설정합니다 UIImageView.
  3. 하위 분류를 시도 UIImageView했지만 도움이되지 않았습니다.

아래의 일부 코드를 첨부,이 코드에서 나는 모두를 초기화 UIImageView하고 UILabel레이블이 이벤트를 발사의 측면에서 잘 작동합니다. 나는 관련없는 코드를 배제하려고 노력했습니다. 고마워요, 일란

UIImageView *single_view = [[UIImageView alloc]initWithFrame:CGRectMake(200, 200, 100, 100)];
single_view.image=img;
single_view.layer.zPosition=4;

UITapGestureRecognizer *singleTap = [[UITapGestureRecognizer alloc] initWithTarget:self action:@selector(singleTapGestureCaptured:)];
[single_view addGestureRecognizer:singleTap];
[single_view setMultipleTouchEnabled:YES];
[single_view setUserInteractionEnabled:YES];
[self.myScrollView addSubview:single_view];
self.myScrollView.userInteractionEnabled=YES;

UILabel *testLabel = [[UILabel alloc] initWithFrame:CGRectMake(100, 100, 100, 100)];
testLabel.backgroundColor=[UIColor redColor];
[self.myScrollView addSubview:testLabel];
[testLabel addGestureRecognizer:singleTap];
[testLabel setMultipleTouchEnabled:YES];
[testLabel setUserInteractionEnabled:YES];
testLabel.layer.zPosition=4;

그리고 이벤트를 처리하는 방법 :

- (void)singleTapGestureCaptured:(UITapGestureRecognizer *)gesture
{
    UIView *tappedView = [gesture.view hitTest:[gesture locationInView:gesture.view] withEvent:nil];
    NSLog(@"Touch event on view: %@",[tappedView class]);
}

말했듯이 라벨 탭이 수신됩니다.


답변

터치 가능한 UIImageView를 만든 다음 navbar에 배치하는 대신 UIImageView에서 만드는 UIBarButtonItem을 만들어야합니다.

먼저 이미지보기를 만듭니다.

UIImageView *yourImageView = [[UIImageView alloc] initWithImage:[UIImage imageNamed:@"nameOfYourImage.png"]];

그런 다음 이미지보기에서 barbutton 항목을 만듭니다.

UIBarButtonItem *yourBarButtonItem = [[UIBarButtonItem alloc] initWithCustomView:yourImageView];

그런 다음 탐색 모음에 막대 단추 항목을 추가합니다.

self.navigationItem.rightBarButtonItem = yourBarButtonItem;

이 코드는 내비게이션 컨트롤러 viewcontroller 배열 내부에있는 뷰 컨트롤러로 들어갑니다. 따라서 기본적으로이 “터치 가능한 이미지 모양의 바 버튼 항목”은이 뷰 컨트롤러가 표시 될 때 내비게이션 바에 만 나타납니다. 다른 뷰 컨트롤러를 누르면이 네비게이션 바 버튼 항목이 사라집니다 ~


답변

원하는 것은 하위 뷰 를 포함 touchesBegan:withEvent:하는 UIView(또는 하위 클래스) 의 메서드를 재정의하는 것입니다 UIImageView.

이 메서드 내에서 UITouch터치가 UIImageView인스턴스 의 경계 내에 있는지 테스트 합니다 (라고 가정 해 보겠습니다 imageView).

즉, 수행 CGPoint요소 [touch locationInView]와 교차을 CGRect요소 [imageView bounds]? CGRectContainsPoint이 테스트를 실행 하려면 함수 를 살펴보십시오 .