Я пытаюсь назначить UIImageView
на действие, когда пользователь удаляет его.
Я знаю, как создать действие для UIButton
, но как я мог бы воспроизвести одно и то же поведение UIButton
, но используя UIImageView
?
Я пытаюсь назначить UIImageView
на действие, когда пользователь удаляет его.
Я знаю, как создать действие для UIButton
, но как я мог бы воспроизвести одно и то же поведение UIButton
, но используя UIImageView
?
Вам понадобится UITapGestureRecognizer
.
Для настройки используйте это:
override func viewDidLoad()
{
super.viewDidLoad()
let tapGestureRecognizer = UITapGestureRecognizer(target: self, action: #selector(imageTapped(tapGestureRecognizer:)))
imageView.isUserInteractionEnabled = true
imageView.addGestureRecognizer(tapGestureRecognizer)
}
func imageTapped(tapGestureRecognizer: UITapGestureRecognizer)
{
let tappedImage = tapGestureRecognizer.view as! UIImageView
// Your action
}
(Вы также можете использовать UIButton
и назначить ему изображение без текста, а затем просто подключить IBAction
)
Вам необходимо добавить распознаватель жестов (для касания используйте 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")
}
Вы можете добавить UITapGestureRecognizer
в imageView, просто перетащить его в свою раскадровку /xib, перетащить Ctrl-изображение из образа в файл gestureRecognizer и Ctrl-перетащить из gestureRecognizer в Swift файл, чтобы сделать IBAction
.
Вам также необходимо включить взаимодействие пользователя с UIImageView
, как показано на этом изображении:
Для быстрого 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")
}
Код Swift4
Попробуйте это несколько новых методов расширения:
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")
}
}
}
Теперь, когда мы хотим добавить UITapGestureRecognizer
в подкласс UIView
или UIView
такой как UIImageView
, мы можем сделать это без создания связанных функций для селекторов!
Использование:
profile_ImageView.addTapGestureRecognizer {
print("image tapped")
}
Фактически вы можете просто установить образ 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)
Чтобы сообщить пользователям, что вы загружаете изображение
Вы можете поместить UIButton
с прозрачным фоном поверх UIImageView
и прослушать нажатие кнопки перед загрузкой изображения
let pictureTap = UITapGestureRecognizer(target: self, action: #selector(MyInfoTableViewController.imageTapped))
userImageView.addGestureRecognizer(pictureTap)
userImageView.isUserInteractionEnabled = true
@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) кнопку на вашем изображении, а затем обработать взаимодействие на кнопке.