我正在使用SWRevealViewController
来在我的应用中实现侧面导航菜单。我想这样做是为了在打开后视图时不能与前视图交互,除了当用户轻敲前视图时,后视图将关闭并且前视图可以再次交互。我有两个SWRevealViewController
委托方法,目前正在从前视图中删除交互。
- (void)revealController:(SWRevealViewController *)revealController willMoveToPosition: (FrontViewPosition)position {
if(position == FrontViewPositionLeft) {
self.view.userInteractionEnabled = YES;
} else {
self.view.userInteractionEnabled = NO;
}
}
- (void)revealController:(SWRevealViewController *)revealController didMoveToPosition: (FrontViewPosition)position {
if(position == FrontViewPositionLeft) {
self.view.userInteractionEnabled = YES;
} else {
self.view.userInteractionEnabled = NO;
}
}
然而,当轻敲前视图时,这不会导致后视图关闭。非常感谢任何帮助,谢谢!
答案 0 :(得分:30)
如果您使用的是SWIFT,您可以在frontViewController中执行以下操作:
override func viewDidLoad() {
super.viewDidLoad()
if self.revealViewController() != nil {
self.view.addGestureRecognizer(self.revealViewController().panGestureRecognizer())
self.view.addGestureRecognizer(self.revealViewController().tapGestureRecognizer())
}
}
代码适用于TAP和PAN手势。
答案 1 :(得分:22)
在frontViewController的ViewDidLoad中,您需要添加UITapGestureRecognizer
SWRevealViewController *revealController = [self revealViewController];
UITapGestureRecognizer *tap = [revealController tapGestureRecognizer];
tap.delegate = self;
[myView addGestureRecognizer:tap];
这会导致后视图在点按前视图时关闭,这是SWRevealViewController
的默认行为。
答案 2 :(得分:12)
编辑:更改UIView的autoresizingMask以适应Swift 2,感谢Marroc的comment
这是@ avdyushin答案的Swift-SWRevealViewController 2.x版本:
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.75, animations: {
lock.alpha = 0.333
}
)
}
}
答案 3 :(得分:6)
SWRevealViewController
。revealController:willMoveToPosition:
的{{1}}。带有漂亮动画的示例:
SWRevealViewControllerDelegate
此旧版本1.x SWRevealViewController的解决方案。
答案 4 :(得分:4)
考虑这个简单的解决方案,效果很好
private let DimmingViewTag = 10001
extension UIViewController: SWRevealViewControllerDelegate {
func setupMenuGestureRecognizer() {
revealViewController().delegate = self
view.addGestureRecognizer(revealViewController().panGestureRecognizer())
view.addGestureRecognizer(revealViewController().tapGestureRecognizer())
}
//MARK: - SWRevealViewControllerDelegate
public func revealController(revealController: SWRevealViewController!, didMoveToPosition position: FrontViewPosition) {
if case .Right = position {
let dimmingView = UIView(frame: view.frame)
dimmingView.tag = DimmingViewTag
view.addSubview(dimmingView)
view.bringSubviewToFront(dimmingView)
} else {
view.viewWithTag(DimmingViewTag)?.removeFromSuperview()
}
}
}
UIViewController
中的简单用法:
override func viewDidAppear(animated: Bool) {
super.viewDidAppear(animated)
setupMenuGestureRecognizer()
}
答案 5 :(得分:3)
将以下代码放在菜单视图控制器上,它适用于我
@interface SidebarTableViewController() {
UIView* coverView;
}
- (void)viewWillDisappear:(BOOL)animated {
[coverView removeFromSuperview];
//[self.revealViewController.frontViewController.view setUserInteractionEnabled:YES];
// get your window screen size
}
- (void)viewWillAppear:(BOOL)animated {
// get your window screen size
CGRect screenRect = [[UIScreen mainScreen] bounds];
//create a new view with the same size
coverView = [[UIView alloc] initWithFrame:screenRect];
// change the background color to black and the opacity to 0.6
coverView.backgroundColor = [[UIColor blackColor] colorWithAlphaComponent:0.6];
// add this new view to your main view
[self.revealViewController.frontViewController.view addSubview:coverView];
// [self.revealViewController.frontViewController.view setUserInteractionEnabled:NO];
}
答案 6 :(得分:2)
感谢mixth& avdyushin因为那里有很大的帮助。这里是从那里得到的Swift 4版本的答案,以节省您的几个小时:
extension UIViewController: SWRevealViewControllerDelegate {
func setupMenuGestureRecognizer() {
revealViewController().delegate = self
view.addGestureRecognizer(revealViewController().panGestureRecognizer())
view.addGestureRecognizer(revealViewController().tapGestureRecognizer())
}
//MARK: - SWRevealViewControllerDelegate
public func revealController(_ revealController: SWRevealViewController!, willMoveTo position: FrontViewPosition) {
let tagId = 112151
print("revealController delegate called")
if revealController.frontViewPosition == FrontViewPosition.right {
let lock = self.view.viewWithTag(tagId)
UIView.animate(withDuration: 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.black
lock.addGestureRecognizer(UITapGestureRecognizer(target: self.revealViewController(), action: #selector(SWRevealViewController.revealToggle(_:))))
self.view.addSubview(lock)
UIView.animate(withDuration: 0.75, animations: {
lock.alpha = 0.333
}
)
}
}
}
现在从后视图控制器的 viewDidLoad 调用此功能 setupMenuGestureRecognizer 。
或者您也可以将 SWRevealViewControllerDelegate 直接实现到后视图控制器类,并在类本身中使用SWRevealViewControllerDelegate函数。
答案 7 :(得分:0)
我使用了tapGestureRecognizer,但仍然存在一些问题。我试过这个并且效果很好!
定义课程:
@interface IgnoreView : UIView
@property (nonatomic, assign) BOOL shouldAllTouchesBeForMe;
@end
实施:
@implementation IgnoreView
- (UIView *)hitTest:(CGPoint)point withEvent:(UIEvent *)event
{
if( self.shouldAllTouchesBeForMe ){
return self;
}
return [super hitTest:point withEvent:event];
}
@end
然后在IgnoreView类的Interface Builder中创建View类
在ViewController中,执行:
in - viewDidLoad
self.revealViewController.delegate = self;
[self.view addGestureRecognizer:self.revealViewController.tapGestureRecognizer];
viewcontroller中的工具也是:
- (void)revealController:(SWRevealViewController *)revealController didMoveToPosition:(FrontViewPosition)position
{
IgnoreView *i = (id)self.view;
i.shouldAllTouchesBeForMe = position == FrontViewPositionRight;
}
你们都准备好了!
答案 8 :(得分:-2)
在菜单视图控制器上,添加以下内容:
-(void)viewWillAppear:(BOOL)animated {
[super viewWillAppear:animated];
[self.revealViewController.frontViewController.view setUserInteractionEnabled:NO];
}
-(void)viewDidDisappear:(BOOL)animated {
[super viewDidDisappear:animated];
[self.revealViewController.frontViewController.view setUserInteractionEnabled:YES];
}
然后在菜单项视图控制器上,在 viewDidLoad 上添加:
SWRevealViewController *revealController = [self revealViewController];
[revealController tapGestureRecognizer];
另请查看我的回答here。它解决了前视图交互(加上幻灯片手势)的问题。