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】:

默认情况下,UIImageViewisUserInteractionEnabled 属性设置为 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 的图像

背景UIImageView模糊效果(Swift 4)

如何使用 Swift 模糊 UIImageView 中的现有图像?

嵌入在 UIScrollView (SWIFT) 中的 UIImageView 的约束问题

对于 Uiimageview 如何在 ios swift 4 中将 CGgradient 背景颜色设置为背景颜色?

在 Swift 4 中以编程方式将 UIImageView、UILabel 添加到 UIStackView