Я новичок в Swift (и в разработке XCode в целом), и мне было интересно, как сделать ImageView на раскадровке интерактивным. То, что я пытаюсь сделать, это сделать так, чтобы при его нажатии показывался другой контроллер представления.
Как сделать UIImageView на раскадровке кликабельным (быстрым)
Ответ 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
.
Хотя раскадровка имеет свои ограничения, нет необходимости писать код для кликабельных изображений. ;)
Ответ 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 для некоторого собрания), этот метод должен работать нормально.