所以我在我的应用程序中显示了一个图像,我正在使用Xcode快速创建,并且我希望例如在点击图像时打印"Image Clicked".这是我得到的:
这是一个假设每当用户点击图像时被调用的函数:
func imageViewTapped(imageView: UIImageView) {
print("Image Clicked")
}
Run Code Online (Sandbox Code Playgroud)
我有这个功能,可以添加用户与图像的交互:
func tapRecognition(image: UIImageView) {
image.isUserInteractionEnabled = true
let tapRecognizer = UITapGestureRecognizer(target: self, action: Selector(("imageViewTapped:")))
image.addGestureRecognizer(tapRecognizer)
}
Run Code Online (Sandbox Code Playgroud)
最后但并非最不重要的是,我在viewDidLoad()函数中创建了一个UIImageView类型的图像,我调用了:
tapRecognition(image: imageView)
Run Code Online (Sandbox Code Playgroud)
当我运行它并单击图像时,我收到一个错误,指出:"以NSException类型的未捕获异常终止".任何帮助都会很棒!非常感谢.
dfd*_*dfd 11
这里有一些代码可以使用Swift 3:
override func viewDidLoad() {
super.viewDidLoad()
// #1
let myImage = UIImage(named: "myImage")
let imageView = UIImageView()
imageView.image = myImage
// #2
imageView.isUserInteractionEnabled = true
let tapRecognizer = UITapGestureRecognizer(target: self, action: #selector(imageTapped))
imageView.addGestureRecognizer(tapRecognizer)
// #3
imageView.translatesAutoresizingMaskIntoConstraints = false
view.addSubview(imageView)
// set imageView contraints
}
// #4
func imageTapped(recognizer: UITapGestureRecognizer) {
print("Image was tapped")
let thePoint = recognizer.location(in: view)
let theView = recognizer.view
}
Run Code Online (Sandbox Code Playgroud)
1虽然你的代码有点不同而有些缺失,但我相信这基本相同.除非您需要访问image或imageView在其他地方,请在本地声明它们viewDidLoad.(我建议不要UIImageView像你那样命名(image),因为这会让其他人在阅读你的代码时感到困惑.)
2这就是我认为@rmaddy是正确的.如果您使用的是Swift 3,那么选择器的正确语法就是我所拥有的.这可能是我们的代码唯一的问题 - 并且值得记住a UIImageView的默认值为isUserInteractioEnabled = true.
3您没有任何实际布局代码.但是如果使用自动布局(而不是框架),则基本语法将关闭自动调整,确保将视图添加到视图层次结构中,并设置约束.很多时候(大多数情况下)你可以设置它们viewDidLoad,但是如果你需要帧信息,请使用viewWillLayoutSubviews或者viewDidLayoutSubviews.
4起初我认为您的水龙头功能还可以,但经过进一步检查,它不是.发件人不是被点击的视图,它是识别器.我在print语句后添加了两行代码.第一个将CGPointtap的变量放入变量中.第二个将UIView附加到识别器(在这种情况下imageView)放入变量中.此外,如果您需要知道是imageView在水龙头区域的子视图,请使用该hitTest()方法.
编辑:
我被问到如何imageView在点击时执行的函数中使用视图(在我的示例中).
首先,你不能做的一件事是将它作为参数传递.iOS和macOS都不能以这种方式运行.但是你有(至少)三种选择.(它们都不使用tag属性,在某些情况下是另一种选择.)
1您显示的代码表示您已经知道图像视图已被点击.这可能是一种情况,因为您创建的每个手势只能附加到单个视图.如果这是您的场景,请考虑在视图控制器级别声明图像视图,并在您的函数内编写所需的代码.
2但是,如果您在视图控制器中有两个图像视图,并且附加了一个轻击手势,并且您希望它们根据所拍摄的内容执行某些操作,该怎么办?在这种情况下,您可以使用手势的view属性,并使用强制转换.骨架代码:
let imageView1 = UIImageView()
let imageView2 = UIImageView()
let tapRecognizer1 = UITapGestureRecognizer(target: self, action: #selector(imageTapped))
imageView1.addGestureRecognizer(tapRecognizer1)
let tapRecognizer2 = UITapGestureRecognizer(target: self, action: #selector(imageTapped))
imageView2.addGestureRecognizer(tapRecognizer2)
func imageTapped(recognizer: UITapGestureRecognizer) {
print("Image was tapped")
let imageView = recognizer.view as? UIImageView
if imageView != nil {
//do something here
}
}
Run Code Online (Sandbox Code Playgroud)
请注意,骨架可能在转换中出现语法错误.逻辑是坚实的,我在网上写这个,而不是在Xcode中.基本上将附加的UIView作为图像视图并检查为零.
3如果您有多个子视图并且想要知道哪个子视图被点击,我通常会使用这种情况.在你的情况下,假设你有两个UIImageViews像上面那样,但你有一个水龙头识别器附加到主视图?在这种情况下,您可以使用该hitTest()方法.骨架代码:
let imageView1 = UIImageView()
let imageView2 = UIImageView()
let tapRecognizer = UITapGestureRecognizer(target: self, action: #selector(imageTapped))
imageView1.addGestureRecognizer(self.view)
func imageTapped(recognizer: UITapGestureRecognizer) {
print("Image was tapped")
let p = recognizer.location(in: view)
if imageView1.layer.hitTest(p) != nil {
// do something here to imageView1
} else if imageView2.layer.hitTest(p) != nil {
// do something here to imageView2
}
}
Run Code Online (Sandbox Code Playgroud)
我更喜欢使用图层,但视图也有hitTest()方法.对此的值是一个视图,其中7个子视图可以使用单个手势进行编码,如果您想忽略点击其中3个子视图(以及在主视图上点击),您可以.
关于最后一个,我有一段时间的小例子项目.它包含一个带有两个彩色标签作为子视图的图像视图.点击任一标签时,计数器会递增.我在1-2个答案中使用了这个,我想我会把它放在GitHub存储库中.随意看看它:带有标签的图像.
| 归档时间: |
|
| 查看次数: |
4784 次 |
| 最近记录: |