Swift 4 UIButton действие в UIImageView не работает - PullRequest
0 голосов
/ 02 июня 2018

Я пытаюсь добавить кнопку удаления в качестве подпредставления на изображении.Это моя текущая структура: -> 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, когда меня вызывают.Однако я хотел бы сохранить кнопку в представлении «Наклейка», чтобы, когда пользователь перемещает наклейку, кнопка перемещалась вместе с ней.

Может кто-нибудь помочь, и дайте мне знать, как я могу держать кнопку в окне стикера?

Ответы [ 2 ]

0 голосов
/ 02 июня 2018

По умолчанию isUserInteractionEnabled свойство UIImageView установлено в false.Установите значение true, и ваша кнопка начнет отвечать.Вы можете установить его как в коде, так и в раскадровках.

Также попробуйте установить для свойства clipsToBounds вашего просмотра изображений значение true.Она обрежет вашу кнопку, если она выходит за границы изображения.Это может быть одной из причин того, что ваша кнопка не получает прикосновений.

0 голосов
/ 02 июня 2018

Вы должны создать делегат протокола для действия кнопки.Это пример кода:

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, добавьте свой собственный класс изображений viewview 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
  }

}
...