Swift에서 UIImageView 객체에 액션을 할당하는 방법


186

UIImageView사용자가 탭할 때 액션 을 할당하려고 합니다.

에 대한 액션을 만드는 방법을 알고 UIButton있지만의 동일한 동작을 모방 할 수는 UIButton있지만 UIImageView?

답변:


421

당신이 필요합니다 UITapGestureRecognizer. 설정하려면 다음을 사용하십시오.

override func viewDidLoad()
{
    super.viewDidLoad()

    let tapGestureRecognizer = UITapGestureRecognizer(target: self, action: #selector(imageTapped(tapGestureRecognizer:)))
    imageView.isUserInteractionEnabled = true
    imageView.addGestureRecognizer(tapGestureRecognizer)
}

@objc func imageTapped(tapGestureRecognizer: UITapGestureRecognizer)
{
    let tappedImage = tapGestureRecognizer.view as! UIImageView

    // Your action
}

(또한 UIButton텍스트를 사용하지 않고 단순히를 사용하는 것보다 a를 사용 하여 이미지를 할당 할 수도 있습니다 IBAction)


3
Nitpick : var tgr = UITapGestureRecognizer (target : self action : Selector ( "imageTapped :")), 두 매개 변수 사이에 쉼표가 필요합니다.
sysuser

3
MidHun MP가 아래에 언급 한대로 userInteractionEnabled = true인지 확인하십시오.
Sheraz

2
Swift 3.0에서 action : Selector ( "imageTapped :") 구문은 action : #selector (imageTapped))로 변경되었습니다.
emily

2
또한 스위프트 3.0에 userInteractionEnabled 속성은 isUserInteractionEnabled로 이름이 바뀌 었습니다
덕 아모스

2
Swift 4를 사용하면 이것이 효과가 있었지만 @objc함수에 수정자를 추가해야했습니다 .
Mark Lyons

68

에 제스처 인식기를 추가해야합니다 (탭 사용 UITapGestureRecognizer , 길게 누르기 UILongPressGestureRecognizer ) UIImageView.

let tap = UITapGestureRecognizer(target: self, action: #selector(YourClass.tappedMe))
imageView.addGestureRecognizer(tap)
imageView.isUserInteractionEnabled = true

다음과 같이 선택기 방법을 구현하십시오.

@objc func tappedMe()
{
    println("Tapped on Image")
}

13
userInteractionEnabled가 핵심입니다.
kennydust 5

@hatim : 현재 직면 한 문제는 무엇입니까? 새로운 문제가있는 경우 새로운 질문으로 게시하십시오.
Midhun MP

@MidhunMP 이미지 뷰를 동적으로 생성하고 있으며이 답변에 기록 된 내용을 정확하게 수행했지만 tappedMe () 함수가 호출되지 않습니다.
hatim

1
그것은 다음과 같은 변화로 나를 위해 일했습니다 : let tap = UITapGestureRecognizer (target : self, action : #selector (ViewController.tappedMe)) // next line-> successIndicatorImg.addGestureRecognizer (tap) // next line-> successIndicatorImg.isUserInteractionEnabled = 사실
Almir Campos

@hatim 여러 제스처보기에 동일한 제스처를 사용하고 있습니까? 여러보기에 동일한 제스처를 사용하고 하나만 나를 위해 노력 하면서이 문제를 해결했습니다. 여러 제스처를 만들면 나에게 도움이되었습니다.
nadafafif

36

UITapGestureRecognizerimageView 에 a 를 추가하고 Storyboard / xib로 드래그하고 imageView에서 gestureRecognizer로 Ctrl- 드래그하고 gestureRecognizer에서 Swift 파일로 Ctrl- 드래그하면IBAction 있습니다.

UIImageView이 이미지와 같이 의 사용자 상호 작용을 활성화해야합니다 . 여기에 이미지 설명을 입력하십시오


4
UIImageView기본적으로 터치에 응답하지 않습니다. 또한 사용자 상호 작용을 활성화해야합니다.
rmaddy

@rmaddy 죄송합니다. 맞습니다. 편집했습니다.
Emil

1
나는 당신이 IB를 사용하여 이것을 설정할 수있는 방법을 좋아합니다. 드래그 앤 드롭은 강력하며 가능할 것으로 기대하지 않았습니다. +1입니다. 멍청한 놈으로서 스토리 보드를 "마우스로 둘러 보지 않고"어떻게 연결되어 있는지 쉽게 알 수 없습니다. 선호도에 따라 다르지만 "코드로보기"를 선호합니다.
angryITguy

14

swift 2.0 이상에서는

@IBOutlet weak var imageView: UIImageView!
    override func viewDidLoad() {
        super.viewDidLoad()
        // Do any additional setup after loading the view, typically from a nib.
        let tap = UITapGestureRecognizer(target: self, action: #selector(ViewController.tappedMe))
        imageView.addGestureRecognizer(tap)
        imageView.userInteractionEnabled = true
    }
    func tappedMe()
    {
        print("Tapped on Image")
    }

userInteractionEnabled 지금 isUserInteractionEnabled로 이름이 바뀌 었습니다
짜잔 프리드먼에게

11

스위프트 4 코드

이 새로운 확장 방법을 사용해보십시오 :

import UIKit

extension UIView {

    fileprivate struct AssociatedObjectKeys {
        static var tapGestureRecognizer = "MediaViewerAssociatedObjectKey_mediaViewer"
    }

    fileprivate typealias Action = (() -> Void)?


    fileprivate var tapGestureRecognizerAction: Action? {
        set {
            if let newValue = newValue {
                // Computed properties get stored as associated objects
                objc_setAssociatedObject(self, &AssociatedObjectKeys.tapGestureRecognizer, newValue, objc_AssociationPolicy.OBJC_ASSOCIATION_RETAIN)
            }
        }
        get {
            let tapGestureRecognizerActionInstance = objc_getAssociatedObject(self, &AssociatedObjectKeys.tapGestureRecognizer) as? Action
            return tapGestureRecognizerActionInstance
        }
    }


    public func addTapGestureRecognizer(action: (() -> Void)?) {
        self.isUserInteractionEnabled = true
        self.tapGestureRecognizerAction = action
        let tapGestureRecognizer = UITapGestureRecognizer(target: self, action: #selector(handleTapGesture))
        self.addGestureRecognizer(tapGestureRecognizer)
    }


    @objc fileprivate func handleTapGesture(sender: UITapGestureRecognizer) {
        if let action = self.tapGestureRecognizerAction {
            action?()
        } else {
            print("no action")
        }
    }

}

이제 우리는을 추가 할 때마다 UITapGestureRecognizerA를 UIView또는 UIView서브 클래스와 같은UIImageView 셀렉터를위한 관련 함수를 만들지 않고도 그렇게 할 수 있습니다!

용법:

 profile_ImageView.addTapGestureRecognizer {
        print("image tapped")
    }

2
잘 작동합니다. 구현을 훨씬 단순화했습니다.
Nick N

사용 된 리플렉션 기능으로 조금 무섭습니다. 향후 스위프트 버전에서 작동 할 가능성이 있습니까?
BananaAcid

1
이것은 매우 우아하고 도움이됩니다. 나를 위해
Taylor Maxwell

2
❤️ 나는 확장 프로그램을 좋아합니다
리카르도

8

실제로의 이미지를 UIButton일반적으로에 넣을 이미지로 설정할 수 UIImageView있습니다. 예를 들어, 어디에서 할 것인가 :

myImageView.image = myUIImage

대신 다음을 사용할 수 있습니다.

myButton.setImage(myUIImage, forState: UIControlState.Normal)

코드는 다음과 같습니다.

override func viewDidLoad(){
  super.viewDidLoad()

  var myUIImage: UIImage //set the UIImage here
  myButton.setImage(myUIImage, forState: UIControlState.Normal)
}

@IBOutlet var myButton: UIButton!
@IBAction func buttonTap(sender: UIButton!){
  //handle the image tap
}

이 방법을 사용할 때 가장 좋은 점은 데이터베이스에서 이미지를로드해야하는 경우 이미지를 설정하기 전에 단추 제목을 설정할 수 있다는 것입니다.

myButton.setTitle("Loading Image...", forState: UIControlState.Normal)

사용자에게 이미지를로드하고 있다고 알리려면


2


UITapGestureRecognizer (target : self ...)의 'self'가 게으른 변수가 아닌 경우 탭 자체가 아니기 때문에 TapGestureRecognizer에 등록하기 위해 lazy를 추가해야합니다 . isUserInteractionEnable = true로 설정하더라도 지연 변수없이 등록되지 않습니다.

lazy var imageSelector : UIImageView = {
    let image = UIImageView(image: "imageName.png")
    //now add tap gesture
    image.isUserInteractionEnabled = true
    image.addGestureRecognizer(UITapGestureRecognizer(target: self, action: #selector(handleImageSelector)))
    return image
}()
@objc private func handleImageSelector() {
    print("Pressed image selector")
}

1

당신은 넣을 수 UIButton의 상단 위에 투명 배경 UIImageView이미지를로드하기 전에 버튼을 탭에 대해 듣고


1
옵션을 설명하는 빠른 방법입니다. 나는 모두가 그것을 알고 있다고 생각했다!
depsch ali

3
실제 이유없이 불필요한 UI 구성 요소를 추가하는 것은 좋지 않습니다. UI의 복잡성이 증가하고 동일한 자동 레이아웃 제약 조건을 처리해야합니다. TapGestureRecognizer를 추가하는 것이 좋습니다.
Gunhan

1

스위프트 4 코드


ViewdidLoad ()의 1 단계

   let pictureTap = UITapGestureRecognizer(target: self, action: #selector(MyInfoTableViewController.imageTapped))
       userImageView.addGestureRecognizer(pictureTap)
       userImageView.isUserInteractionEnabled = true

2 단계 다음 기능 추가

@objc func imageTapped() {

        let imageView = userImageView
        let newImageView = UIImageView(image: imageView?.image)
        newImageView.frame = UIScreen.main.bounds
        newImageView.backgroundColor = UIColor.black
        newImageView.contentMode = .scaleAspectFit
        newImageView.isUserInteractionEnabled = true
        let tap = UITapGestureRecognizer(target: self, action: #selector(dismissFullscreenImage))
        newImageView.addGestureRecognizer(tap)
        self.view.addSubview(newImageView)

        self.navigationController?.isNavigationBarHidden = true
        self.tabBarController?.tabBar.isHidden = true

    }

테스트되고 올바르게 작동합니다


0

이미지보기에 보이지 않는 (불투명도 = 0) 버튼 을 배치 한 다음 버튼의 상호 작용을 처리하는 것이 좋습니다 .

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