Как сделать UIImageView на раскадровке кликабельным (быстрым)

Я новичок в Swift (и в разработке XCode в целом), и мне было интересно, как сделать ImageView на раскадровке интерактивным. То, что я пытаюсь сделать, это сделать так, чтобы при его нажатии показывался другой контроллер представления.

Ответ 1

Вы можете добавить tapGesture для этого. Вот код:

class ViewController: UIViewController {

@IBOutlet weak var imageView: UIImageView!
override func viewDidLoad() {
    super.viewDidLoad()
    // create tap gesture recognizer
    let tapGesture = UITapGestureRecognizer(target: self, action: "imageTapped:")

    // add it to the image view;
    imageView.addGestureRecognizer(tapGesture)
    // make sure imageView can be interacted with by user
    imageView.userInteractionEnabled = true
}

func imageTapped(gesture: UIGestureRecognizer) {
    // if the tapped view is a UIImageView then set it to imageview
    if let imageView = gesture.view as? UIImageView {
        println("Image Tapped")
        //Here you can initiate your new ViewController

        }
    }
}

Swift 3.0

class ViewController: UIViewController {

    @IBOutlet weak var imageView: UIImageView!
    override func viewDidLoad() {
        super.viewDidLoad()
        // create tap gesture recognizer
        let tapGesture = UITapGestureRecognizer(target: self, action: #selector(ViewController.imageTapped(gesture:)))

        // add it to the image view;
        imageView.addGestureRecognizer(tapGesture)
        // make sure imageView can be interacted with by user
        imageView.isUserInteractionEnabled = true
    }

    func imageTapped(gesture: UIGestureRecognizer) {
        // if the tapped view is a UIImageView then set it to imageview
        if (gesture.view as? UIImageView) != nil {
            print("Image Tapped")
            //Here you can initiate your new ViewController

        }
    }
}

Swift 5.0

class ViewController: UIViewController {

    @IBOutlet weak var imageView: UIImageView!

    override func viewDidLoad() {
        super.viewDidLoad()
        // create tap gesture recognizer
        let tapGesture = UITapGestureRecognizer(target: self, action: #selector(ViewController.imageTapped(gesture:)))

        // add it to the image view;
        imageView.addGestureRecognizer(tapGesture)
        // make sure imageView can be interacted with by user
        imageView.isUserInteractionEnabled = true
    }

    @objc func imageTapped(gesture: UIGestureRecognizer) {
        // if the tapped view is a UIImageView then set it to imageview
        if (gesture.view as? UIImageView) != nil {
            print("Image Tapped")
            //Here you can initiate your new ViewController

        }
    }
}

Ответ 2

Вы можете сделать это еще проще и сделать изображение кликабельным через раскадровку без какого-либо кодирования.

  • Сначала вам нужно перетащить UITapGestureRecognizer на ваш UIImageView в раскадровке.
  • Затем вы создаете IBAction, который хотите запустить в своем коде, с @IBAction func imageClicked(_ sender: Any) {}
  • Затем вам нужно подключить UITapGestureRecognizer к IBAction в вашем классе, выбрав распознаватель жестов в структуре Document Outline, затем переключившись на Connection Inspector Tab и перетащив " Sent Actions → " Selector на свой UIViewController где вы затем выберите соответствующее действие, которое вы создали ранее.
  • Наконец, вы должны установить флажок " User Interaction Enabled в представлении изображения.

Готово, полностью кликабельный UIImageView без написания ни одной строки кода, кроме очевидной функции, которую вы хотите вызвать. Но, эй, если вы, например, хотите вместо этого перейти к переходу, то вы можете вообще не кодировать, используя распознаватели жестов " Triggered Segues вместо " Sent Actions.

Хотя раскадровка имеет свои ограничения, нет необходимости писать код для кликабельных изображений. ;)

enter image description here

Ответ 3

Я бы предложил создать UIButton без текста и вместо этого сделать его желаемым. После этого вы можете перетаскивать CTRL с изображения на контроллер вида, к которому вы хотите перейти. Или вы можете просто сделать IBAction в своем коде контроллера контроллера, который вручную отходит.

Ответ 4

для быстрой версии 3.0 попробуйте под кодом

override func viewDidLoad() {
super.viewDidLoad()

let tap1 = UITapGestureRecognizer(target: self, action: #selector(tapGesture1))
imageview.addGestureRecognizer(tap1)
imageview.isUserInteractionEnabled = true
}
func tapGesture1() {
    print("Image Tapped")
}

Ответ 5

На раскадровке установлен режим просмотра изображения, а затем получить с помощью этого метода

-(void)touchesBegan:(NSSet *)touches withEvent:(UIEvent *)event 
{
    UITouch *touch = [touches anyObject];

    if ([touch view] == yourImageView)
    {
            //add your code for image touch here 
    }
}

Ответ 6

Я добился этого, установив взаимодействие с пользователем enable = true

и этот код ниже в TouchesBegan... Чистый и простой для этого

ImageView также был внутри StackView

if let touch = touches.first {
   if touch.view == profilePicture {
      print("image touched")
   }
}

Ответ 7

Ну, хотя вы можете использовать UITapGestureRecognizer, как упомянуто выше, если вам нужно сделать быстрый проект и просто позаботиться о функциональности приложения, самый простой способ - это создать прозрачную кнопку, закрывающую ваш UIImageView без текста, и затем использовать ее написать любой код, который вы хотите. Конечно, это не рекомендуется, если вы делаете очень важный проект или что-то в этом роде, но если вы просто хотите сделать быстрое приложение (скажем, очень простой MVP для некоторого собрания), этот метод должен работать нормально.