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


97

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

감사.


이 상황에서는 사용자 지정 UIButton을 대신 사용합니다.
titaniumdecoy

답변:


137

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

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

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


탐색 모음에 버튼을 추가했으며 터치 이벤트도 처리 할 수 ​​있습니다. 하지만이 버튼에 둥근 이미지를 추가하고 싶습니다. 프로그래밍 방식으로 어떻게 할 수 있는지 알려주시겠습니까? 또한 프로그래밍 방식으로 단추 속성을 "사용자 지정"으로 설정하는 방법을 알려 주시겠습니까?
ebaccount

UIButton에 대한 문서를보세요-컨트롤 상태에 대한 배경 이미지를 설정해야합니다. Normal vs. Selected / Highlighted에 대해 다른 이미지를 원할 것입니다. 버튼 스타일은 UIButtonStyleCustom으로 설정 한 것입니다. 다시 한 번 UIButton의 스타일 속성에 대한 문서를 참조하십시오.
Kendall Helmstetter Gelner

1
UIImageView 위에 UIButton을 약간 위에 추가하지 않습니까? 추가 개체를 추가하는 반면 이미 기존 UIImageView 개체의 touches 메서드를 구현할 수 있습니다. 아니?
samvermette

32
메모리에서 UIButton의 크기를 보면 사실상 아무것도 아니며 화면 당 몇 개만 있습니다. 무료로 얻을 수있는 것은 다양한 상태 (예 : 내부 터치 업)에 대한 전체 대상 작업 배선과 아래로 누르고 손가락을 옆으로 밀 때 트리거되지 않는 것과 같은 멋진 동작입니다. 기본적으로 버튼은 전체 시스템에서 가장 정교하게 만들어진 개체 중 하나이며 더 잘 작동하는 사용자 지정 터치 코드를 수행 할 것이라고 생각하는 것은 광기입니다. 저렴하고 잘 작동하는 것을 사용하고, 프레임 워크가 아직 처리하지 않는 작업에 대해서는 사용자 정의 작업을 저장하십시오.
Kendall Helmstetter Gelner

6
터치 이벤트 만 있으면 UIControl을 오버레이 할 수도 있습니다 (addTaget : action : forControlEvents :를 통해). 이미지와 여러 상태가있는 UIButton보다 약간 저렴합니다. 또한 전 처리기 조건문을 사용하여 오버레이 된 컨트롤의 배경색을 분홍색으로 변경하여 정확히 어디에 있는지 볼 수 있습니다 (그리고 존재한다는 것을 기억합니다 :-).
Jeff

115

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

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

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

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

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


나는 그것을 시도했지만 결코 touchesBegan 이벤트를받지 못합니다 ... 왜 그럴까요?
Markus

5
@Markus : 같은 문제가 있었지만 userInteractionEnabled부모보기에서 YES 로 설정 하여 문제를 해결했습니다 . 참조 stackoverflow.com/questions/5887305/…
Saxon Druce 2011 년

51

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

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

[myImageView setUserInteractionEnabled:YES];

[myImageView addGestureRecognizer:newTap];


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

도움이 되길 바랍니다.


userInteractionEnabled = true는 잊기 쉬운 부분입니다. 감사합니다.
마이클 피터슨

23

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];

10
DO는 imgView_에 대한 UserInteractionEnabled 세트하는 것을 잊지
익명 화이트에게

13

나는 지난 몇 시간 동안 내 문제에 대한 해결책을 찾으려고 다른 스레드에 있었고 아무 소용이 없었습니다. 많은 개발자들이이 문제를 공유하고 있음을 알고 있으며 여기 사람들이 이에 대해 알고 있다고 생각합니다. 내부에 여러 이미지가 있으며 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]);
}

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


6

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


3

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

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

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


답장을 보내 주셔서 감사합니다. 다음과 같은보기를 추가했습니다. [navBar addSubview : self.pImage]; // 탐색 모음의 하위보기로 추가됩니다. 함수를 재정의했지만 함수가 호출되지 않았습니다. 그래도 UIImageView의 userInteractionEnabled 속성을 YES로 설정했습니다. 내가 놓친 것이 있습니까?
ebaccount

touchesBegan : withEvent : 메소드를 확인하세요. 이것이 어떻게 작동하는지에 대한 검색 엔진에 대한 많은 예가 있습니다.
Alex Reynolds

1

먼저 UIButton을 배치 한 다음이 버튼에 대한 배경 이미지를 추가하거나 버튼 위에 UIImageView를 배치해야합니다.

또는

UIImageView를 탭할 때 클릭 동작을 얻도록 UIImageView에 탭 제스처를 추가 할 수 있습니다.


0

이 답변에 대한 Swift 4 솔루션을 찾는 사람들을 위해. 다음을 사용하여 UIImageView에서 터치 이벤트를 감지 할 수 있습니다.

let gestureRecognizer: UITapGestureRecognizer = UITapGestureRecognizer(target: self, action: #selector(imageViewTapped))
imageView.addGestureRecognizer(gestureRecognizer)
imageView.isUserInteractionEnabled = true

그런 다음 선택기를 다음과 같이 정의해야합니다.

@objc func imageViewTapped() {
    // Image has been tapped
}

-2

해당 뷰에 제스처를 추가하고 해당 뷰에 이미지를 추가하면 이미지에서도 제스처를 감지 할 수 있습니다. 터치 이벤트의 대리자 메서드로 시도해봤을 때도 감지 할 수 있습니다. 감사

당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.