Как вызвать действие из подкласса UITabBarController с помощью Swift - PullRequest
1 голос
/ 13 марта 2020

Я создал подкласс UITabBarController в своем приложении iOS, потому что я хотел добавить среднюю кнопку «+» на панели вкладок. Я добавил эту дополнительную кнопку, используя код ниже:

class XGTabBarViewController: UITabBarController {

let menuButton = UIButton(frame: CGRect(x: 0, y: 0, width: 70, height: 70))
private let optionMenu = UIAlertController(title: nil, message: "New", preferredStyle: .actionSheet)

override func viewDidLoad() {
    super.viewDidLoad()

    let action1 = UIAlertAction(title: "Action 1", style: .default)
    let action2 = UIAlertAction(title: "Action 2", style: .default)
    let cancelAction = UIAlertAction(title: "Cancel", style: .cancel)

    optionMenu.addAction(action1)
    optionMenu.addAction(action2)
    optionMenu.addAction(cancelAction)

    var menuButtonFrame = menuButton.frame
    let iconConfig = UIImage.SymbolConfiguration(pointSize: 24, weight: .medium, scale: .medium)

    let iconImage = UIImage(systemName: "plus", withConfiguration: iconConfig)
    let icon = UIImageView(frame: CGRect(x: 0, y: 0, width: 30, height: 30))
    icon.image = iconImage
    icon.tintColor = UIColor.white

    menuButtonFrame.origin.y = view.bounds.height - menuButtonFrame.height - 50
    menuButtonFrame.origin.x = view.bounds.width/2 - menuButtonFrame.size.width/2
    menuButton.frame = menuButtonFrame

    menuButton.backgroundColor = UIColor(named: "LinkBlue")
    menuButton.layer.cornerRadius = menuButtonFrame.height/2
    menuButton.layer.shadowColor = UIColor.black.cgColor
    menuButton.layer.shadowRadius = 3
    menuButton.layer.shadowOpacity = 0.3
    menuButton.layer.shadowOffset = CGSize(width: 0, height: 3)

    menuButton.addSubview(icon)
    icon.translatesAutoresizingMaskIntoConstraints = false
    icon.widthAnchor.constraint(equalToConstant: 30).isActive = true
    icon.heightAnchor.constraint(equalToConstant: 30).isActive = true
    icon.centerXAnchor.constraint(equalTo: menuButton.centerXAnchor).isActive = true
    icon.centerYAnchor.constraint(equalTo: menuButton.centerYAnchor).isActive = true

    view.addSubview(menuButton)

    menuButton.addTarget(self, action: #selector(menuButtonAction(sender:)), for: .touchUpInside)

    view.layoutIfNeeded()
}

@objc private func menuButtonAction(sender: UIButton) {
    self.present(optionMenu, animated: true, completion: nil)
}

Я настраиваю контроллер панели вкладок через IB. И вот как это выглядит

enter image description here

Итак, что я хочу знать, так это то, стоит ли мне определять действие кнопки меню в этом классе? Или есть лучший (лучший метод) способ сделать это?

Как видите, я попытался добавить лист действий, который будет отображаться при нажатии кнопки. Но я получаю некоторые ошибки макета. Мне интересно, если я добавил этот код в нужном месте.

Я получаю сообщение об ошибке ниже:

enter image description here

Спасибо!

Ответы [ 2 ]

0 голосов
/ 13 марта 2020

Похоже, мой код был верным. Но, очевидно, в UIAlertController есть ошибка, из-за которой он нарушает макеты. Обходной путь найден в этой ссылке

Быстрые ограничения AlertViewController по умолчанию, нарушающие ограничения

0 голосов
/ 13 марта 2020

Пожалуйста, добавьте контроллер панели вкладок и три viewcontroller подключитесь к панели вкладок. Центральная панель вкладок контроллера видимости. Установить вставку изображения.

Нет ошибок макета.

Tabbar image

Tabbar image inset

import UIKit

class TabBarVC: UITabBarController {

override func viewDidLoad() {
    super.viewDidLoad()


    let tabBar = self.tabBar
    (tabBar.items![0] ).selectedImage = UIImage(named:"icn_audio_icon")?.withRenderingMode(.alwaysOriginal)
    (tabBar.items![1] ).selectedImage = UIImage(named:"icn_home_active")?.withRenderingMode(.alwaysOriginal)
    tabBar.items![2].image = UIImage(named:"icn_categary")?.withRenderingMode(.alwaysOriginal)

    tabBar.items![0].image = UIImage(named:"icn_audio_icon")?.withRenderingMode(.alwaysOriginal)
    tabBar.items![1].image = UIImage(named:"icn_home")?.withRenderingMode(.alwaysOriginal)
    tabBar.items![2].image = UIImage(named:"icn_categary")?.withRenderingMode(.alwaysOriginal)

    self.tabBarController?.selectedIndex = 1
    tabBar.layer.shadowColor = UIColor.red.cgColor
    tabBar.layer.shadowOffset = CGSize(width: 0.0, height: 2.0)
    tabBar.layer.shadowRadius = 5
    tabBar.layer.shadowOpacity = 0.6
    tabBar.layer.masksToBounds = false


}
  override func viewDidLayoutSubviews() {
     super.viewDidLayoutSubviews()
     self.tabBar.invalidateIntrinsicContentSize()
  }

}

func tabBarController(_ tabBarController: UITabBarController, shouldSelect viewController: UIViewController) -> Bool {
  if viewController.isKind(of: ActionViewController.self) {
     let vc =  ActionViewController()
     vc.modalPresentationStyle = .overFullScreen
     self.present(vc, animated: true, completion: nil)
     return false
  }
  return true
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...