SlideMenu没有在iOS 11上检测到关闭菜单的触摸。为什么?

时间:2017-10-12 12:57:30

标签: ios

我在我的一个个人项目中使用了pod iOS-Slide-Menu repo。

如果我在iOS上运行我的项目< 11一切都按预期工作:当侧面菜单(蓝色视图控制器),触摸它外面,即绿色部分。自动关闭它

enter image description here

但是在使用iOS 11的设备上运行时,在外面点击时菜单不会关闭。

另一个奇怪的情况是,这只发生在最近编译的版本(目前使用Xcode 9.0),在iOS11设备上运行App Store版本也能正常工作。

所以我的问题是:

  • 为什么会这样?
  • 如何在不更换整个图书馆的情况下避免这种情况发生?

我在github中创建了一个SAMPLE PROJECT来重现问题。

3 个答案:

答案 0 :(得分:1)

Hello @Adrime我已下载您的代码并在Xcode 9.0中测试过 发现像你一样的问题。外面没有关闭视图。

看到库后,我找到了一个解决方案。

在SlideNavigationController.m文件中,

已经创建了一个- (void)enableTapGestureToCloseMenu:(BOOL)enable

的方法

在该方法中,只需注释这一行[self.view removeGestureRecognizer:self.tapRecognizer];

,你的问题就解决了。

这条线移除了外面的攻击。<​​/ p>

答案 1 :(得分:1)

<强>更新

我得到了你想要的东西,只需改变你的viewWillLayoutSubviews方法

- (void)viewWillLayoutSubviews
{
    [super viewWillLayoutSubviews];

    // Update shadow size of enabled
    if (self.enableShadow)
        self.view.layer.shadowPath = [UIBezierPath bezierPathWithRect:self.view.bounds].CGPath;

    // When menu open we disable user interaction
    // When rotates we want to make sure that userInteraction is enabled again
    //[self enableTapGestureToCloseMenu:NO];

    if (SYSTEM_VERSION_GREATER_THAN_OR_EQUAL_TO(@"7.0"))
        self.interactivePopGestureRecognizer.enabled = YES;

    self.topViewController.view.userInteractionEnabled = YES;

    if (self.menuNeedsLayout)
    {
        [self updateMenuFrameAndTransformAccordingToOrientation];

        // Handle different horizontal/vertical slideOffset during rotation
        // On iOS below 8 we just close the menu, iOS8 handles rotation better so we support keepiong the menu open
        if (SYSTEM_VERSION_GREATER_THAN_OR_EQUAL_TO(@"8.0") && [self isMenuOpen])
        {
            Menu menu = (self.horizontalLocation > 0) ? MenuLeft : MenuRight;
            [self openMenu:menu withDuration:0 andCompletion:nil];
        }

        self.menuNeedsLayout = NO;
    }
}

我做了什么:评论//[self enableTapGestureToCloseMenu:NO];代码并将代码放在下面

if (SYSTEM_VERSION_GREATER_THAN_OR_EQUAL_TO(@"7.0"))
  self.interactivePopGestureRecognizer.enabled = YES;
self.topViewController.view.userInteractionEnabled = YES;

<强> OLD:

这是因为在SlideNavigationController.m文件中您正在调用[self enableTapGestureToCloseMenu:NO];

只需删除它或让iOS 11为所有

传递 YES

对于EX。

if (IOS_VERSION == 11) {
  [self enableTapGestureToCloseMenu:YES];
}
else {
  [self enableTapGestureToCloseMenu:NO];
}

因为当您打开幻灯片菜单或单击绿色区域时,请致电

[self enableTapGestureToCloseMenu:NO];

按照方法代码

   - (void)enableTapGestureToCloseMenu:(BOOL)enable
{
    if (enable)
    {
        if (SYSTEM_VERSION_GREATER_THAN_OR_EQUAL_TO(@"7.0"))
            self.interactivePopGestureRecognizer.enabled = NO;

        self.topViewController.view.userInteractionEnabled = NO;
        [self.view addGestureRecognizer:self.tapRecognizer];
    }
    else
    {
        if (SYSTEM_VERSION_GREATER_THAN_OR_EQUAL_TO(@"7.0"))
            self.interactivePopGestureRecognizer.enabled = YES;

        self.topViewController.view.userInteractionEnabled = YES;
        [self.view removeGestureRecognizer:self.tapRecognizer];
    }
}

视图为removeGestureRecognizer

答案 2 :(得分:1)

在您的SlideNavigationController.m文件中,转到viewWillLayoutSubviews方法并删除或评论下面的行

 [self enableTapGestureToCloseMenu:NO];

这是因为viewWillLayoutSubviews方法最初在ios 11中被调用了!

所以,从viewWillLayoutSubviews开始,enableTapGestureToCloseMenu会被调用,它会从右侧菜单中删除手势识别器!