你如何使情节提要上的 UIImageView 可点击(swift)
Posted
技术标签:
【中文标题】你如何使情节提要上的 UIImageView 可点击(swift)【英文标题】:How do you make an UIImageView on the storyboard clickable (swift) 【发布时间】:2015-03-23 03:33:42 【问题描述】:我是 swift 新手(以及一般的 Xcode 开发),我想知道如何使情节提要板上的 ImageView 可点击。我想做的是让它在点击时显示另一个视图控制器。
【问题讨论】:
看看这个***.com/a/27235390/3810673 【参考方案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
【讨论】:
虽然这是可能的,但创建带有图像的UIButton
比使图像可点击要好得多。添加辅助功能选项时,您会感谢我的。【参考方案2】:
您可以做到更简单,并通过故事板制作可点击的图像完全无需编码。
首先,您需要将UITapGestureRecognizer
拖到 Storyboard 中的 UIImageView
上。
然后使用@IBAction func imageClicked(_ sender: Any)
创建要在代码中运行的 IBAction
接下来,您需要将UITapGestureRecognizer
连接到班级中的IBAction
,方法是在Document Outline
中选择手势识别器,然后切换到Connection Inspector Tab
并拖动Sent Actions
-> Selector
到您的UIViewController
,然后您可以在其中选择您之前创建的相应操作。
最后,您必须在 Identity Inspector 和 Attributes Inspector 的图像视图上设置复选框 User Interaction Enabled
。
完成,一个完全可点击的 UIImageView,除了您要调用的明显功能外,无需编写任何代码。但是,嘿,例如,如果您想要推送一个 segue,那么您可以通过使用手势识别器 Triggered Segues
而不是它的 Sent Actions
来完全不编码。
虽然 Storyboard 有其局限性,但无需为可点击的图像编写代码。 ;)
【讨论】:
向你学习很多,尊重! 你得到一个 cookie。 即使我在 Identity Inspector 中检查了“已启用用户交互”,我也必须在viewDidLoad()
中明确设置:fooImage.isUserInteractionEnabled = true
才能使其工作(Xcode 错误?还是什么?我不知道)
@HassanTareq 请在身份检查器和属性检查器上设置“启用用户交互”;为我工作。【参考方案3】:
我建议创建一个没有文本的 UIButton 并将其设置为您想要的图像。完成此操作后,您可以按住 CTRL 键从图像拖动到要继续的视图控制器。或者你可以在你的视图控制器的代码中创建一个手动 segues 的 IBAction。
【讨论】:
这很好用。您也可以配置嵌入在按钮中的 UIImageView。它避免了使用透明按钮覆盖 UIImageView 的旧技巧所具有的混合层问题。【参考方案4】:对于 swift 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),则此方法应该可以正常工作。
【讨论】:
【参考方案8】:首先,创建一个图像视图。比写这段代码覆盖 func viewDidLoad() super.viewDidLoad()
let tap = UITapGestureRecognizer(target: self, action: #selector(tapGesture))
imageview.addGestureRecognizer(tap)
imageview.isUserInteractionEnabled = true
func tapGesture()
print("Image View Tapped")
在您的视图控制器中。
UITapGestureRecognizer 方法做的一切都是可点击的
【讨论】:
【参考方案9】:在我看来,合理的方法是创建 UIImage 的扩展...
这是我找到的代码...
public typealias SimpleClosure = (() -> ())
private var tappableKey : UInt8 = 0
private var actionKey : UInt8 = 1
extension UIImageView
@objc var callback: SimpleClosure
get
return objc_getAssociatedObject(self, &actionKey) as! SimpleClosure
set
objc_setAssociatedObject(self, &actionKey, newValue, objc_AssociationPolicy.OBJC_ASSOCIATION_RETAIN_NONATOMIC)
var gesture: UITapGestureRecognizer
get
return UITapGestureRecognizer(target: self, action: #selector(tapped))
var tappable: Bool!
get
return objc_getAssociatedObject(self, &tappableKey) as? Bool
set(newValue)
objc_setAssociatedObject(self, &tappableKey, newValue, objc_AssociationPolicy.OBJC_ASSOCIATION_RETAIN)
self.addTapGesture()
fileprivate func addTapGesture()
if (self.tappable)
self.gesture.numberOfTapsRequired = 1
self.isUserInteractionEnabled = true
self.addGestureRecognizer(gesture)
@objc private func tapped()
callback()
用法应该是这样的
@IBOutlet weak var exampleImageView: UIImageView!
didSet
self.exampleImageView.tappable = true
override func viewDidLoad()
super.viewDidLoad()
self.exampleImageView.callback =
//TODO: Here you put the On click code.
【讨论】:
以上是关于你如何使情节提要上的 UIImageView 可点击(swift)的主要内容,如果未能解决你的问题,请参考以下文章
如何以编程方式更改使用自动布局在情节提要上创建的 UIImageView 的大小?
UIImageView 在不同设备上保留情节提要“预览屏幕边界” - 框架不根据屏幕尺寸更新