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)
}
@objc func imageTapped(tapGestureRecognizer: UITapGestureRecognizer)
{
let tappedImage = tapGestureRecognizer.view as! UIImageView
// Your action
}
(また、使用することができUIButton
、テキストなしで、そこに画像を割り当て、単により接続しますIBAction
)
@objc
が、関数に修飾子を追加する必要がありました。
ジェスチャレコグナイザ(タップの場合は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に追加し、1つをStoryboard / xibにドラッグし、Ctrlキーを押しながらimageViewからGestureRecognizerに、Ctrlキーを押しながらGestureRecognizerからSwiftファイルにドラッグして、を作成できIBAction
ます。
UIImageView
この画像に示すように、でのユーザー操作を有効にする必要もあります。
UIImageView
デフォルトではタッチに応答しません。また、ユーザー操作を有効にする必要があります。
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")
}
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
ようなサブクラスにa を追加したいときはいつでも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)
画像を読み込んでいることをユーザーに伝えるには
UITapGestureRecognizer(target:self ...)の 'self'がレイジー変数でない場合はnilになるため、TapGestureRecognizerを登録するためにレイジーを追加する必要があります。isUserInteractionEnable = trueを設定しても、遅延varなしでは登録されません。
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")
}
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
}