我正在使用cosmicmind材质swift库,并按照示例代码尝试使FAB MenuView正常工作。
我复制了代码并添加了我想要的按钮,测试我只是用2个按钮进行测试。我面临的问题是使用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之上。
当视图最初加载时,我可以单击菜单按钮,动画正确发生并出现button2。但是,它不允许我按第二个按钮或再次按下按钮关闭菜单,除非我导航到选项卡栏控制器中的另一个选项卡,然后导航回FAB MenuView所在的选项卡。我正在prepareMenuView()
加载viewDidLoad
函数,就像示例中所示。
不确定如何修改它以便它可以按照需要运行。选择另一个ViewController生命周期方法来运行prepareMenuView()
是没有意义的。
答案 0 :(得分:1)
所以代码的问题是button2
只有handleButton
的选择器处理程序。 handleMenu
处理程序未添加到其中。所以你有两个解决方案。
handleMenu
来电添加到handleButton
internal func handleButton(button: UIButton) {
print("Hit Button \(button)")
handleMenu(button)
}
button2
的{{1}}实例添加选择器处理程序。 handleMenu
任何一个选项都可以使用,只需记住订单很重要。因此,如果您希望在加载某些内容之前关闭菜单,请在添加
button2.addTarget(self, action: #selector(handleMenu), forControlEvents: .TouchUpInside)
button2.addTarget(self, action: #selector(handleButton), forControlEvents: .TouchUpInside)
之前调用该方法或添加选择器处理程序handleMenu
。
:)一切顺利!