Космический разум материал быстрый MenuView не закрывается
Я использую космическую библиотеку космического разума и следую коду примеров, чтобы попытаться заставить работать FAB MenuView.
Я скопировал код и добавил нужные мне кнопки, чтобы проверить, я просто тестирую двумя кнопками. Проблема, с которой я сталкиваюсь, связана с handleMenu
функция:
/// Handle the menuView touch event.
internal func handleMenu() {
if menuView.menu.opened {
menuView.close()
(menuView.menu.views?.first as? MaterialButton)?.animate(MaterialAnimation.rotate(rotation: 0))
} else {
menuView.menu.open() { (v: UIView) in
(v as? MaterialButton)?.pulse()
}
(menuView.menu.views?.first as? MaterialButton)?.animate(MaterialAnimation.rotate(rotation: 0.125))
}
}
Полный код этого UINavigationController:
import UIKit
import Material
class MyTeeUpsController: UINavigationController {
/// MenuView reference.
private lazy var menuView: MenuView = MenuView()
/// Default spacing size
let spacing: CGFloat = 16
/// Diameter for FabButtons.
let diameter: CGFloat = 56
/// Handle the menuView touch event.
internal func handleMenu() {
if menuView.menu.opened {
menuView.close()
(menuView.menu.views?.first as? MaterialButton)?.animate(MaterialAnimation.rotate(rotation: 0))
} else {
menuView.menu.open() { (v: UIView) in
(v as? MaterialButton)?.pulse()
}
(menuView.menu.views?.first as? MaterialButton)?.animate(MaterialAnimation.rotate(rotation: 0.125))
}
}
/// Handle the menuView touch event.
internal func handleButton(button: UIButton) {
print("Hit Button \(button)")
}
private func prepareMenuView() {
//let w: CGFloat = 52
var img:UIImage? = MaterialIcon.cm.add?.imageWithRenderingMode(.AlwaysTemplate)
let button1: FabButton = FabButton()//frame: CGRectMake((view.bounds.width - w)-10, 550,w,w))
button1.setImage(img, forState: .Normal)
button1.setImage(img, forState: .Highlighted)
button1.pulseColor = MaterialColor.blue.accent3
button1.backgroundColor = MaterialColor.blueGrey.lighten1
button1.borderColor = MaterialColor.blue.accent3
button1.borderWidth = 1
button1.addTarget(self, action: #selector(handleMenu), forControlEvents: .TouchUpInside)
menuView.addSubview(button1)
img = UIImage(named: "filing_cabinet")?.imageWithRenderingMode(.AlwaysTemplate)
let button2:FabButton = FabButton()
button2.depth = .None
button2.setImage(img, forState: .Normal)
button2.setImage(img, forState: .Highlighted)
button2.pulseColor = MaterialColor.blue.accent3
button2.borderColor = MaterialColor.blue.accent3
button2.borderWidth = 1
button2.backgroundColor = MaterialColor.blueGrey.lighten1
button2.addTarget(self, action: #selector(handleButton), forControlEvents: .TouchUpInside)
menuView.addSubview(button2)
menuView.menu.direction = .Up
menuView.menu.baseSize = CGSizeMake(diameter, diameter)
menuView.menu.views = [button1,button2]
view.layout(menuView).width(diameter).height(diameter).bottomRight(bottom: 58, right: 20)
}
private func prepareTabBarItem() {
//todo
}
override func viewDidLoad() {
super.viewDidLoad()
prepareMenuView()
}
}
Меню, которое я встроил как подпункт UINavigationController. Причина, по которой я добавил этот подпункт, заключается в том, что FAB находится над контроллером поиска / отображения (TableView) и, таким образом, FAB может оставаться поверх TableView даже при прокрутке содержимого таблицы.
Когда представление первоначально загружается, я могу нажать на кнопку меню, и анимация происходит правильно, и появляется кнопка 2. Однако, это не позволяет мне нажимать вторую кнопку ИЛИ закрывать меню, снова нажимая кнопку 1, ЕСЛИ Я не перехожу на другую вкладку в контроллере панели вкладок, а затем возвращаюсь обратно на вкладку, где находился FAB MenuView. Я загружаю свой prepareMenuView()
функция в viewDidLoad
так же, как это показано в примере.
Не уверен, как изменить это так, чтобы он мог вести себя как хотелось бы. Нет смысла выбирать другой метод жизненного цикла ViewController для запуска prepareMenuView()
,
1 ответ
Так что проблема с вашим кодом в том, что button2
имеет только обработчик селектора для handleButton
, handleMenu
обработчик не добавляется к нему. Итак, у вас есть два решения.
- Добавить
handleMenu
позвонить вhandleButton
internal func handleButton(button: UIButton) {
print("Hit Button \(button)")
handleMenu(button)
}
- Добавьте обработчик селектора к
button2
экземпляр дляhandleMenu
,
button2.addTarget(self, action: #selector(handleMenu), forControlEvents: .TouchUpInside)
button2.addTarget(self, action: #selector(handleButton), forControlEvents: .TouchUpInside)
Любой из вариантов сработает, просто помните, что порядок имеет значение. Поэтому, если вы хотите, чтобы меню было закрыто перед загрузкой некоторого содержимого, тогда вызовите метод перед или добавьте обработчик селектора handleMenu
прежде чем добавить handleButton
,
:) Всего наилучшего!