2017-10-12 17 views
2

我在我的個人項目之一中使用吊艙iOS-Slide-Menu回購。SlideMenu無法檢測iOS 11上的解除菜單觸摸。爲什麼?

如果我在iOS上運行我的項目< 11一切都按預期工作:當側面菜單(藍色視圖控制器)觸及外部時,即綠色部分。自動關閉它

enter image description here

但隨着iOS的11菜單中的設備上運行外敲擊時開不關閉掉。

另一個好奇的情況是,這隻發生在最近編譯的版本(目前使用Xcode 9.0),在iOS11設備上運行App Store版本也能正常工作。

所以我的問題是:

  • 這究竟是爲什麼?
  • 如何避免這種情況發生,而無需更換整個庫?

我在github中創建了一個SAMPLE PROJECT以重現此問題。

+0

看看我更新的代碼,它的工作原理與iOS 10一樣 – iPatel

回答

1

在你SlideNavigationController.m文件去viewWillLayoutSubviews方法,並刪除或低於行

[self enableTapGestureToCloseMenu:NO]; 

這是因爲viewWillLayoutSubviews方法被調用在ios 11最初發表評論!

所以,從viewWillLayoutSubviewsenableTapGestureToCloseMenu被調用,它是從右側菜單刪除手勢識別器!

1

你好@Adrime我已經下載了你的代碼並在Xcode 9.0中測試了 發現了和你一樣的問題。外部竊聽未關閉視圖。

看到圖書館後,我找到了一個解決方案。

在SlideNavigationController.m文件,

一種方法是已經創建這是- (void)enableTapGestureToCloseMenu:(BOOL)enable

該方法

,只是評論這一行[self.view removeGestureRecognizer:self.tapRecognizer];

,你的問題就解決了。

這條線刪除了外部攻絲的好處。

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; 

舊:

這是因爲在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的視圖。