UIImageView中的Swift 4 UIButton操作无法正常工作

时间:2018-06-02 11:38:50

标签: ios uibutton uiimageview swift4

我正在尝试在图像中添加删除按钮作为子视图。这是我目前的结构: -> class DesignViewController: UIViewController | -> class Sticker: UIImageView, UIGestureRecognizerDelegate | -> UI button inside the Sticker

Inside 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被调用。但是我想将按钮保留在贴纸视图中,这样当用户移动贴纸时,按钮就会随着子视图一起移动。

任何人都可以帮忙,让我知道如何将按钮保留在贴纸视图中?

2 个答案:

答案 0 :(得分:0)

您应该为按钮操作创建协议委托。这是代码示例:

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,添加您的自定义imageview类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
  }

}

答案 1 :(得分:0)

默认情况下,isUserInteractionEnabled的{​​{1}}属性设置为false。将其设置为true,您的按钮将开始响应。您可以在代码和故事板中进行设置。

还可以尝试将imageview的UIImageView属性设置为true。如果按钮超出图像边界,它将剪切按钮。这可能是您的按钮没有触及的原因之一。