Сделать весь UIView интерактивным на кнопке панели навигации? - PullRequest
0 голосов
/ 05 августа 2020

Я делаю кнопку левой панели с настраиваемым видом (btnView). Я хочу, чтобы это представление было расположено на краю экрана, что Swift не позволяет, поскольку он перемещает кнопку панели вправо, если я пытаюсь добавить представление, которое расположено дальше слева. Когда я расширяю фрейм, чтобы он соответствовал моему UIView, он просто сдвигает все, чтобы соответствовать размеру поля.

введите описание изображения здесь <ограничение установлено на уровне примерно 15 пунктов от края. </p>

Включение isUserInteractionEnabled не влияет на возможность нажатия UIView, он по-прежнему реагирует на эту небольшую область, а не на крайний левый край.

Вот моя кнопка прямо сейчас:

func addBackButton() {
        // position of btn view on navbar
        let btnView = UIView(frame: CGRect(x:-15.5, y:-6, width: 58.5, height: 44))
        // position of label in btn view
        let label = UILabel(frame: CGRect(x: 24.5, y: 13, width: 0, height: 0))
        label.font = UIFont.systemFont(ofSize: 17)
        label.textAlignment = .left
        label.textColor = .systemBlue
        label.text = "VET"
        label.sizeToFit()
        btnView.addSubview(label)
        
        let icon = UIImage(systemName: "chevron.left", withConfiguration: UIImage.SymbolConfiguration(pointSize: 23, weight: .medium))
        // convert UIImage to UIView
        let iconView = UIImageView(image: icon)
        // position of icon in btn view
        iconView.frame.origin.x = 5.5
        iconView.frame.origin.y = 12
        btnView.addSubview(iconView)

        // make small button to stick the view onto
        let backBtn = UIButton(type: .custom)
        backBtn.addTarget(self, action: #selector(goBack), for: .touchUpInside)
        backBtn.addSubview(btnView)
        
        // make button clickable behind btn view
        btnView.isUserInteractionEnabled = false

        // convert UIButton to UIBarButtonItem and add to navbar
        navigationItem.leftBarButtonItem = UIBarButtonItem(customView: backBtn)
    }

Я также попытался добавить вторую кнопку в btnView, чтобы ее можно было правильно расположить, но по какой-то причине она все еще не нажималась, только кнопка панели навигации область ответила.

Есть более простой способ добиться этого? Я хочу избежать дополнительных классов или расширений, которые я видел в некоторых потоках, но сейчас у меня нет более простых вариантов, поэтому я пересматриваю.

1 Ответ

0 голосов
/ 05 августа 2020

Решение:

Разобрался. Вы можете добавить свое представление и кнопку на панель навигации как Subviews вместо того, чтобы ограничивать их левымBarButton.

  1. Я добавил кнопку поверх своего представления с помощью:

         // add button over view to perform action
     let clickableBtn = UIButton(type: .custom)
     clickableBtn.frame = CGRect(x:0, y:0, width: 58.5, height: 44)
     clickableBtn.addTarget(self, action: #selector(goBack), for: .touchUpInside)
     btnView.addSubview(clickableBtn)
    
  2. Удалены isUserInteractionEnabled и код backBtn

  3. И добавлен вид на панель навигации:

         // add btnView to navbar as subview
     navigationController?.navigationBar.addSubview(btnView)
    
...