显示视图时 UITableView 变为非活动状态

Posted

技术标签:

【中文标题】显示视图时 UITableView 变为非活动状态【英文标题】:UITableView becomes inactive when a view is shown 【发布时间】:2016-08-22 06:05:53 【问题描述】:

我有一个UITableView,每个单元格中都有一些值。接下来我有一个UIView,当用户点击单元格中的任何一个时会显示它。现在我想要做的是允许用户选择多个单元格并能够滚动UITableView,但是每当显示UIView 时,UITableView 就会以某种方式变为非活动状态。 UITableViewsetUserInteractionEnabled 在任何地方都不会被禁用,所以这不是问题。这是用于在用户点击单元格时显示UIView 的代码。

if (communicationView.hidden)
    
        [UIView animateWithDuration:0.3 delay:0.0 options:UIViewAnimationCurveEaseOut animations:^
             CGSize screenSize = [[UIScreen mainScreen] bounds].size;
             [communicationView setFrame:CGRectMake(0, 0, 320, communicationView.frame.size.height)]; 
        completion:^(BOOL finished) 
             NSLog(@"Done!");
             communicationView.hidden=NO;
             [self.contactsTblView setUserInteractionEnabled:YES];
        ];
    

任何帮助将不胜感激。谢谢。

编辑 1 这就是我要这样做的原因:点击单元格时显示的UIView 包含两个选项“通信”和“取消”,如果用户选择通信,他会看到另一个视图以在 Skype、电子邮件等之间进行选择。根据客户的新要求,他希望允许一次向多个人发送电子邮件,为此我必须允许选择多个单元格。

【问题讨论】:

当视图放置在它上面时,你试图实现什么允许用户与 tableview 交互?为什么要这么做 ???无论如何,如果你想实现它,它绝对有可能:)你能解释一下你的需要吗:) @SandeepBhandari- 我添加了一个编辑,请检查。 @TKutal 你试试我的解决方案了吗? @TKutal:在我写下最后一个问题的答案之前,伙计 :) 你要将此通信视图添加到什么视图/窗口?它的框架是什么,它覆盖了整个屏幕还是它的一部分:) 如果您将其添加到不同的窗口,您是否将其设为关键窗口??? @SandeepBhandari- 我将它添加到self.view.window,它并没有覆盖整个屏幕,只是从底部开始的几个单元格。 【参考方案1】:

这是你可以做的,伙计:)

问题: 1.当您向窗口添加视图时,它将开始接受所有用户交互,从而阻止其下方的视图获得任何此类交互。因此,当您在 tableView 顶部加载视图并尝试点击该视图下方的单元格时,将永远不会收到任何此类触摸:)

    UITableView 在显示视图时变为非活动状态:

不,它不会 :) UITableView 仍然非常具有用户交互性,但它基本上不会响应您的任何触摸,因为它永远不会收到任何触摸 :)

我该如何测试它???

简单地将您的 CommunicationView 的框架设置为 CGRect(0,0,self.tableView.frame.size.width,100) 并尝试通过触摸未被 CommunicationView 覆盖的 tableview 的框架来滚动 tableview 它仍然滚动:) 相信我我刚刚测试过相同的:)

现在为什么它在我的情况下不起作用??

我能想到的唯一可能性是您的 CommunicationView 可能会覆盖整个屏幕。尝试将背景颜色设置为您的通信视图并检查它是否覆盖整个屏幕:)

但这是否意味着如果 tableView 顶部有视图,我将永远无法与它交互??

绝对可以:)

假设您希望允许用户点击您的 CommunicationView 正下方的单元格:) 你怎么做?

方法如下:)

你只需要 UIView 的 hitTest 方法 :)

这是我的didSelectRowAtIndexPath,我在这里创建一个名为 testView 的视图并将其添加到 self.view.window 的 frame (0,0,width,200)

override func tableView(tableView: UITableView, didSelectRowAtIndexPath indexPath: NSIndexPath) 
    let testView : MyView = NSBundle.mainBundle().loadNibNamed("MyView", owner: nil, options: nil)[0] as! MyView
    testView.frame = CGRect(x: 0, y: 0, width: self.view.frame.size.width, height: 200)
    testView.backgroundColor = UIColor.redColor()
    testView.belowTableView = self.tableView
    self.view.window?.addSubview(testView)

现在我的 testView 覆盖了一些单元格,但我也想点击它们 :)

这就是我所做的。创建 UIView 的子类让我们调用 MyView :)

class MyView : UIView 
    var belowTableView : UITableView?

    override func hitTest(point: CGPoint, withEvent event: UIEvent?) -> UIView? 
        let hitView = super.hitTest(point, withEvent: event)
        return self.belowTableView
    

这将被设置为我的 testView 类:)

你到底在做什么??? 我正在重写 hitTest 方法,该方法负责返回被点击的视图:) 所以这里正在做的是捕获我的 testView 上的触摸而不是返回我自己我返回它下面的 tableView :)

所以我的 ios 会相信用户点击/触摸了 tableView 而不是顶部的 testView :)

但是如何点击按钮?? 简单修改 hitTest 方法 :) 检查触摸点是否在按钮框架内 :) 如果在按钮内,只需返回我在上面的代码中计算的 hitView 否则返回 self.belowTableView :)

简单是不是 :) 让我知道你是否还有疑问 :)

【讨论】:

我的前辈知道我在过去 3 个小时里一直在努力解决这个问题,现在告诉我有一个透明层覆盖了 tableView(就像你提到的那样)。非常感谢您的详细解释:) @tkutal : 永远欢迎你,伙计 :) 很高兴问题得到解决 :)【参考方案2】:

您的tableView 的触摸正在被communicationView 的触摸取消。 你可以使用

if (communicationView.hidden)

    [UIView animateWithDuration:0.3 delay:0.0 options:UIViewAnimationCurveEaseOut animations:^
           CGSize screenSize = [[UIScreen mainScreen] bounds].size;
           [communicationView setUserInteractionEnabled:NO];
           [communicationView setFrame:CGRectMake(0, 0, 320, communicationView.frame.size.height)];
       
       completion:^(BOOL finished) 
           NSLog(@"Done!");
           communicationView.hidden=NO;
           [self.contactsTblView setUserInteractionEnabled:YES];
       ];

【讨论】:

这将禁用UIView上显示的操作 是的,但有时您会收到您的触摸,这将是最重要的,或者您需要根据需要进行一些自定义

以上是关于显示视图时 UITableView 变为非活动状态的主要内容,如果未能解决你的问题,请参考以下文章

使用搜索栏时无法使表格视图处于非活动状态。苹果手机

按钮在编程动态 stackView (Swift) 中变为非活动状态

激活和停用 UISearchController 时 UITableView 在位置之间跳转

iPad 应用程序在锁定屏幕后变为非活动状态

切换回搜索栏处于活动状态时,选项卡栏视图变为空白

UISearchBar 在活动时与 UITableView 内容重叠