Как обрабатывать события жестов подпредставления в контроллере суперпредставления? - PullRequest
2 голосов
/ 05 октября 2019

Я веб-разработчик и новичок в программировании на iOS.

У меня есть два файла. ViewController.swift и FilterList.swift. Когда я нажал Commend + R, симулятор вышел, и стиль казался правильным. Но нажатие на FilterList представление экземпляра ничего не печатало.

Как я могу заставить это работать? Я просто хочу иметь один компонент пользовательского интерфейса и его события в одном представлении. Нечто подобное в текущей разработке Front-End, такой как React и Vue. Или есть какие-то предпочтительные способы справиться с этим?

ViewController.swift:

import UIKit

class ViewController: UIViewController {


  override func viewDidLoad() {
    super.viewDidLoad()
    // Do any additional setup after loading the view.

    let kindsList = FilterList()

    view.isUserInteractionEnabled = true
    view.backgroundColor = .blue
    kindsList.handleTapGesture = {(sender: UITapGestureRecognizer ) -> Void in
      print("In UIViewController")
    }
    view.addSubview(kindsList)
  }
}

FilterList.swift:

import UIKit

class FilterList: UIView {

  private let titleBarStackView = UIStackView()
  private let titleBarImage = UIImage(systemName: "chevron.right", withConfiguration: UIImage.SymbolConfiguration(pointSize: 16, weight: .regular, scale: .medium))
  private let titleBarImageView = UIImageView()
  private let titleBarLabel = UILabel(frame: CGRect(x: 0, y: 0, width: 160, height: 28))

  // MARK:- Styles
  private let spacing: CGFloat = 16.0

  var labelText = "title"
  var handleTapGesture: ((UITapGestureRecognizer) -> Void)?

  convenience init(label: String) {

    self.init()
    self.labelText = label
    // Tap Gesture
    let tap = UITapGestureRecognizer(target: self, action: #selector(self.handleTap))

    titleBarStackView.addGestureRecognizer(tap)
    titleBarStackView.isUserInteractionEnabled = true
    self.isUserInteractionEnabled = true

  }

  override func layoutSubviews() {
    super.layoutSubviews()
    // Do any additional setup after loading the view.


    // Configure Arrow
    titleBarImageView.image = titleBarImage

    // Configure Label
    titleBarLabel.text = labelText
    titleBarLabel.font = UIFont.preferredFont(forTextStyle: .headline)

    titleBarStackView.addArrangedSubview(titleBarLabel)
    titleBarStackView.addArrangedSubview(titleBarImageView)
    self.addSubview(titleBarStackView)
    setupConstraints()


  }

  private func setupConstraints() {
    titleBarStackView.translatesAutoresizingMaskIntoConstraints = false

    NSLayoutConstraint.activate([
      titleBarStackView.leadingAnchor.constraint(equalTo: self.superview!.safeAreaLayoutGuide.leadingAnchor, constant: spacing),
      titleBarStackView.trailingAnchor.constraint(equalTo: self.superview!.safeAreaLayoutGuide.trailingAnchor, constant: -spacing),
      titleBarStackView.topAnchor.constraint(equalTo: self.superview!.safeAreaLayoutGuide.topAnchor, constant: spacing),
    ])
  }

  @objc func handleTap(_ sender: UITapGestureRecognizer) {
    print("IN UIView")
    self.handleTapGesture?(sender)
  }
}

1 Ответ

2 голосов
/ 05 октября 2019

Вам необходимо использовать инициализатор, который устанавливает жест касания для stackView, т. Е. FilterList(label:. И укажите размер для FilterList, чтобы он имел сенсорную область. Обновление, как показано ниже,

let kindsList = FilterList(label: "Stack")
kindsList.handleTapGesture = {(sender: UITapGestureRecognizer ) -> Void in
    print("In UIViewController")
}
kindsList.frame = self.view.bounds // Update this to your requirement
view.addSubview(kindsList)
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...