我可以处理 UITabbarController 中的双击吗

Posted

技术标签:

【中文标题】我可以处理 UITabbarController 中的双击吗【英文标题】:Can I handle the double tap in UITabbarController 【发布时间】:2014-11-13 16:36:59 【问题描述】:

我需要处理双击操作以从自定义视图表示的导航路径返回。

通常双击会关闭导航控制器堆栈中嵌套的最顶层控制器。我想处理这个动作并做其他事情。

(BOOL)tabBarController:shouldSelectViewController: 中放置代码没有帮助,因为单击和双击没有区别。

谢谢。

【问题讨论】:

你试过手势识别器吗?与代表一起尝试 我可以在手势识别器中注册的 UIView 存在问题。视图/按钮实际上是 UITabBarButton 这是一个私有类。 【参考方案1】:

我在 Swift 2 中重写了 Vladimír Slovak 的答案,以防万一有人需要

var tapCounter : Int = 0
var previousVC = UIViewController()

func tabBarController(tabBarController: UITabBarController, shouldSelectViewController viewController: UIViewController) -> Bool 

    self.tapCounter++
    let hasTappedTwice = self.previousVC == viewController
    self.previousVC = viewController

    if self.tapCounter == 2 && hasTappedTwice 
        self.tapCounter = 0
        print ("Double Tapped!")
    
    if self.tapCounter == 1 
        let delayTime = dispatch_time(DISPATCH_TIME_NOW, Int64(0.3 * Double(NSEC_PER_SEC)))
        dispatch_after(delayTime, dispatch_get_main_queue(), 
            self.tapCounter = 0
        )
    

    return true

【讨论】:

【参考方案2】:

我必须在 tabBarController:shouldSelectViewController: implementation 中添加一个 tapCounter:

self.tapCounter++;


// rule out possibility when the user taps on two different tabs very fast
BOOL hasTappedTwiceOnOneTab = NO;

if(self.previousHandledViewController == viewController) 

    hasTappedTwiceOnOneTab = YES;


self.previousHandledViewController = viewController;


// this code is called in the case when the user tapped twice faster then tapTimeRange
CGFloat tapTimeRange = 0.3;



        if(self.tapCounter == 2 && hasTappedTwiceOnOneTab) 


            // do something when tapped twice 

            self.tapCounter = 0;
            return NO; // or YES when you want the default engine process the event

         else if(self.tapCounter == 1) 

            __block BOOL isSameViewControllerSelected = self.selectedViewController == viewController;
            if(isSameViewControllerSelected) 
                // do something when tapped once
            

            dispatch_after_delay_on_main_queue(tapTimeRange, ^

                self.tapCounter = 0; // reset the counter in case there is a single tap followed with another one, but with longer time then tapTimeRange
            );

            return NO; // or YES when you want the default engine process the event 
        

无需任何私有 api 调用就可以很好地工作。但我想知道是否有更好、更简单的方法。

【讨论】:

【参考方案3】:

试试这个:

@property (nonatomic, assign) NSTimeInterval tapTime;
@property (nonatomic, weak) UIViewController *prevVC;

- viewDidLoad 
    self.tabBarController.delegate = self;


- (void)tabBarController:(UITabBarController *)tabBarController didSelectViewController:(UIViewController *)viewController 
    NSTimeInterval currentTime = [[NSDate date] timeIntervalSince1970];
    NSTimeInterval duration = currentTime - self.tapTime;
    self.tapTime = currentTime;
    if (viewController == self.prevVC) 
        if (duration < 0.35) 
            // double tap detected! write your code here
            self.tapTime = 0;
        
    
    self.prevVC = viewController; 

【讨论】:

【参考方案4】:

我相信你甚至需要使用触摸......

查看下面类似的堆栈溢出:

Objective-c: How to detect double tap on view?

【讨论】:

好的,谢谢。使用手势是一种选择。但我仍然希望 api 应该提供一种更好的方式来处理这个动作。

以上是关于我可以处理 UITabbarController 中的双击吗的主要内容,如果未能解决你的问题,请参考以下文章

具有纵向/横向视图的 UITabBarController

iOS:请求 UITabBarController 旋转的最新解决方案

模态UITabBarController设计

如何暂时停用 tvOS UITabBarController

我可以通过 TabBarItem 上的自定义事件点击来制作自定义 UITabBarController 吗?

我可以将 UITabBarController 用作简单的 viewController 切换器吗?