我已经在我的Swift应用程序中为滑出菜单实现了SWRevealViewController。该框架的一个问题是,当菜单(rearView)展开时,用户仍然可以与frontView进行交互。由于我的frontView是一个完整的出血地图,因此很难通过点击frontView来关闭菜单,因为与其将其识别为平移/轻击来关闭它,还不如将其移动。
对于Objective-C here也有相同的问题。 @hardluckbaby的top answer似乎是最好的解决方案,但它在Objective-C中。我已经在Swift中获得了答案的第一部分,第二部分需要帮助。
在我的RearView控制器中,如果添加了这两个函数,则在打开RearView(菜单)时成功禁用frontView上的交互:
override func viewWillAppear(animated: Bool) {
self.revealViewController().frontViewController.view.userInteractionEnabled = false
}
override func viewWillDisappear(animated: Bool) {
self.revealViewController().frontViewController.view.userInteractionEnabled = true
}
这最后一部分我需要转换为Swift的帮助。假设要为我的frontView重新启用平移/点击手势。在我的frontView中,我想将以下内容放入ViewDidLoad函数中:
SWRevealViewController *revealController = [self revealViewController];
[revealController panGestureRecognizer];
[revealController tapGestureRecognizer];
最后一部分如何用Swift编写?
我尝试将其添加到此功能中,但无法识别我的水龙头。我是否需要将其从IF声明中删除?
override func viewDidLoad() {
super.viewDidLoad()
if self.revealViewController() != nil {
self.view.addGestureRecognizer(self.revealViewController().panGestureRecognizer())
self.view.addGestureRecognizer(self.revealViewController().tapGestureRecognizer())
}
}
最佳答案
找到了一个仍可实现相同结果的不同解决方案(在打开RearView /菜单时禁用与frontView的交互)。它还具有“调暗” frontView以使用户集中在菜单上的其他好处。
menuController中不需要任何代码,我删除了我在问题中引用的viewWillAppear
和viewWillDisappear
中的代码。
以下是我添加到frontView控制器中的内容。缺点是,当菜单打开时,您要在其中禁用交互的所有控制器上都必须包含此代码。
确保在声明类的位置添加SWRevealViewControllerDelegate
。
完整的frontViewController代码:
// make sure to add SWRevealViewControllerDelegate to the class declaration
class LocationConfirmViewController: UIViewController, SWRevealViewControllerDelegate {
@IBOutlet weak var menuBtn: UIBarButtonItem!
override func viewDidLoad() {
super.viewDidLoad()
//menu button control
if self.revealViewController() != nil {
menuBtn.target = self.revealViewController()
menuBtn.action = "revealToggle:"
//new line to declare delegate
self.revealViewController().delegate = self
self.view.addGestureRecognizer(self.revealViewController().panGestureRecognizer())
}
}
// MARK: - Navigation
//controls the frontView when the menu is opened.
//creates a mask that dims the view and blocks any interaction except for tap or pan to close the menu.
func revealController(revealController: SWRevealViewController!, willMoveToPosition position: FrontViewPosition){
let tagId = 4207868622
if revealController.frontViewPosition == FrontViewPosition.Right {
let lock = self.view.viewWithTag(tagId)
UIView.animateWithDuration(0.25, animations: {
lock?.alpha = 0
}, completion: {(finished: Bool) in
lock?.removeFromSuperview()
}
)
lock?.removeFromSuperview()
} else if revealController.frontViewPosition == FrontViewPosition.Left {
let lock = UIView(frame: self.view.bounds)
lock.autoresizingMask = [.FlexibleWidth, .FlexibleHeight]
lock.tag = tagId
lock.alpha = 0
lock.backgroundColor = UIColor.blackColor()
lock.addGestureRecognizer(UITapGestureRecognizer(target: self.revealViewController(), action: "revealToggle:"))
self.view.addSubview(lock)
UIView.animateWithDuration(0.5, animations: {
lock.alpha = 0.333
}
)
}
}
}
将@mixth和他的answer here归功于类似的问题。我进行了一些更改,并添加了更多关于如何准确实现的描述。由于我是Swift的新手,所以我很难理解他的答案。希望这可以帮助其他人。