UIImageView 中的 Swift 4 UIButton 操作不起作用
Posted
技术标签:
【中文标题】UIImageView 中的 Swift 4 UIButton 操作不起作用【英文标题】:Swift 4 UIButton action in UIImageView not working 【发布时间】:2018-06-02 11:38:49 【问题描述】:我正在尝试将删除按钮添加为图像中的子视图。这是我目前的结构:
-> class DesignViewController: UIViewController
|
-> class Sticker: UIImageView, UIGestureRecognizerDelegate
|
-> UI button inside the Sticker
我有里面的贴纸类:
override func touchesBegan(_ touches: Set<UITouch>, with event: UIEvent?)
let button2 = UIButton(frame: CGRect(x: 100, y: 100, width: 100, height: 50))
button2.backgroundColor = .red
button2.setTitle("Delete", for: .normal)
button2.tag = 23
button2.addTarget(self, action: #selector(buttonAction), for: .touchUpInside)
self.addSubview(button2)
@objc func buttonAction(sender: UIButton!)
print("Button tapped")
buttonAction
没有被调用。
当我将self.addSubview(button2)
行更改为:
self.superview?.addSubview(button2)
我可以看到 buttonAction
被调用。但是,我想将按钮保留在 Sticker 视图中,以便当用户移动贴纸时,按钮将作为子视图移动。
谁能帮忙告诉我如何将按钮保留在贴纸视图中?
【问题讨论】:
我认为您丢失了self.userInteractionEnabled = true
。默认情况下,UIImageView
未启用。
@Larme 感谢您的评论。我添加了这一行。 ``` 覆盖初始化(图片:UIImage?) self.isUserInteractionEnabled = true ``` 但没用
未调用 buttonAction。当我将 self.addSubview(button2) 行更改为: self.superview?.addSubview(button2) 为什么要更改行??
Self.superview.addsubview 表示您将其作为视图控制器主视图的子视图
@Vimal 是的,正确。它将按钮放入作为 DesignViewController 类的超级视图中。我尝试使用 self.superview?.addSubview(button2)
的原因是看到 buttonAction 被调用。 TBH 我想保持self.addSubview(button2)
原样
【参考方案1】:
默认情况下,UIImageView
的 isUserInteractionEnabled
属性设置为 false。将其设置为 true,您的按钮将开始响应。您可以在代码和情节提要中设置它。
还可以尝试将您的 imageview 的 clipsToBounds
属性设置为 true。如果按钮超出图像边界,它将剪辑您的按钮。这可能是您的按钮没有被触摸的原因之一。
【讨论】:
【参考方案2】:您应该为按钮操作创建一个协议委托。这是代码示例:
protocol ButtonDelegate: class
func buttonTapped(button: UIButton)
class Sticker: UIImageView
weak var delegate: ButtonDelegate?
override init(frame: CGRect)
super.init(frame: frame)
addSubview(button2)
lazy var button2: UIButton =
let button = UIButton(frame: CGRect(x: 100, y: 100, width: 100, height: 50))
button2.backgroundColor = .red
button2.setTitle("Delete", for: .normal)
button2.tag = 23
button2.addTarget(self, action: #selector(buttonAction), for: .touchUpInside)
return button
()
@objc func buttonAction(sender: UIButton)
guard let delegate = delegate else return
delegate.buttonTapped(button: sender)
所以,现在转到您的 DesignViewControllerl,添加您的自定义图像视图类 Sticker。不要忘记这样做“imageView.delegate = self”。然后在扩展中添加您之前创建的协议委托。代码示例:
class DesignViewController: UIViewController
private lazy var sticker: Sticker =
let iv = Sticker(frame: view.bounds)
iv.delegate = self
return iv
()
override viewDidLoad()
super.viewDidLoad()
view.addSubiew(sticker)
extension DesignViewController: ButtonDelegate
func buttonTapped(button: UIButton)
// input your action here
【讨论】:
谢谢亚历山大。我确实尝试了您的代码,但真正的问题是 buttonAction 甚至没有被调用,更不用说能够委托回 DesignViewController 类 我已经编辑了我的代码示例。这现在有效。我只是忘记编写将委托设置为您的自定义对象的代码示例。希望,它会有所帮助。以上是关于UIImageView 中的 Swift 4 UIButton 操作不起作用的主要内容,如果未能解决你的问题,请参考以下文章
Swift:使用 UIImageView 显示带有从数组 [0..4] 中获取的 URL 的图像
如何使用 Swift 模糊 UIImageView 中的现有图像?
嵌入在 UIScrollView (SWIFT) 中的 UIImageView 的约束问题