Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/facebook/9.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Ios UIImageView中的Swift 4 UIButton操作不工作_Ios_Uibutton_Uiimageview_Swift4 - Fatal编程技术网

Ios UIImageView中的Swift 4 UIButton操作不工作

Ios UIImageView中的Swift 4 UIButton操作不工作,ios,uibutton,uiimageview,swift4,Ios,Uibutton,Uiimageview,Swift4,我试图添加一个删除按钮作为图像中的子视图。这是我目前的结构: ->类DesignViewController:UIViewController | ->类标签:UIImageView、UIgestureRecognitizerDelegate | ->标签内的UI按钮 内贴纸类我有: override func touchesBegan(_ touches: Set<UITouch>, with event: UIEvent?) { let button2 = UIBut

我试图添加一个删除按钮作为图像中的子视图。这是我目前的结构:

->类DesignViewController:UIViewController
|
->类标签:UIImageView、UIgestureRecognitizerDelegate
|
->标签内的UI按钮

内贴纸类我有:

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")        
}
我可以看到
按钮操作
被呼叫。但是,我希望将按钮保留在标签视图中,以便当用户移动标签时,按钮作为子视图随标签一起移动


任何人都可以帮助我并让我知道如何将按钮保留在标签视图中吗?

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

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)
}
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
  }

}
因此,现在转到DesignViewController,添加自定义imageview类标签。别忘了做“imageView.delegate=self”。然后在扩展中添加以前创建的协议委托。代码示例:

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)
}
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
  }

}

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

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)
}
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
  }

}
因此,现在转到DesignViewController,添加自定义imageview类标签。别忘了做“imageView.delegate=self”。然后在扩展中添加以前创建的协议委托。代码示例:

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)
}
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
  }

}

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


还可以尝试将imageview的
clipsToBounds
属性设置为true。如果按钮超出图像边界,它将剪辑按钮。这可能是您的按钮无法触摸的原因之一。

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


还可以尝试将imageview的
clipsToBounds
属性设置为true。如果按钮超出图像边界,它将剪辑按钮。这可能是您的按钮未被触碰的原因之一。

我认为您缺少了
self.userInteractionEnabled=true
。默认情况下,
UIImageView
没有为此启用。@谢谢您的评论。我加了这一行override init(image:UIImage?{self.isUserInteractionEnabled=true}``但未起作用buttonAction未被调用。当我将self.addSubview(button2)行更改为:self.superview?.addSubview(button2)为什么要更改该行??self.superview.addSubview意味着您将其作为viewcontroller@Vimal是的,没错。它将按钮放入superview中,superview是DesignViewController类。我尝试使用
self.superview?.addSubview(button2)
的原因是看到按钮操作被调用。TBH我想保留
self.addSubview(按钮2)
,因为我认为您缺少
self.userInteractionEnabled=true
。默认情况下,
UIImageView
没有为此启用。@谢谢您的评论。我加了这一行override init(image:UIImage?{self.isUserInteractionEnabled=true}``但未起作用buttonAction未被调用。当我将self.addSubview(button2)行更改为:self.superview?.addSubview(button2)为什么要更改该行??self.superview.addSubview意味着您将其作为viewcontroller@Vimal是的,没错。它将按钮放入superview中,superview是DesignViewController类。我尝试使用
self.superview?.addSubview(button2)
的原因是看到按钮操作被调用。TBH我想保持
self.addSubview(按钮2)
为Istanks Alexander。我确实尝试了你的代码,但是真正的问题是buttonAction甚至没有被调用,更不用说能够委托回DesignViewController classI了,我已经编辑了我的代码示例。现在可以了。我只是忘了编写代码示例,在其中我将委托设置到您的自定义对象。希望能有帮助。谢谢亚历山大。我确实尝试了你的代码,但是真正的问题是buttonAction甚至没有被调用,更不用说能够委托回DesignViewController classI了,我已经编辑了我的代码示例。现在可以了。我只是忘了编写代码示例,在其中我将委托设置到您的自定义对象。希望这会有帮助。