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

时间:2016-08-22 06:05:54

标签: ios objective-c uitableview uiview

我有UITableView在每个单元格中都有一些值。接下来我有一个UIView当用户点击任何一个单元格时显示。现在我想要做的是允许用户选择多个单元格并能够滚动UITableView,但只要UITableView显示UIViewsetUserInteractionEnabled就会变为非活动状态。 UITableView的{​​{1}}未在任何地方停用,因此不存在问题。以下是用户点击单元格时用于显示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包含两个选项'Communicate'和'Cancel',如果用户选择了Communicate,他会看到另一个视图,可以在Skype,Email之间进行选择根据客户的新要求,他希望允许一次向多个人发送电子邮件,为此,我将不得不选择多个单元格。

2 个答案:

答案 0 :(得分:1)

这是你可以做的伙伴:)

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

  1. 显示视图时,UITableView变为非活动状态:
  2. 不,它不会:) UITableView仍然是非常用户互动但它不会响应你的任何触摸基本上因为它永远不会接触到任何触摸:)

    我该如何测试?

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

    现在为什么它不适用于我的情况?

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

    但这是否意味着如果有一个视图,我永远不能与tableView交互?

    绝对可以:)

    假设你想让用户点击正好在你的CommunicationView下方的单元格:)你怎么能这样做?

    以下是:)

    你需要的只是UIView的hitTest方法:)

    这是我didSelectRowAtIndexPath创建一个名为testView的视图,并将其添加到另一个框架(0,0,宽度,200)的self.view.window

    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 :))

    简单不是吧:) Lemme知道你是否还有疑问:)

答案 1 :(得分:0)

你通过touchView的触摸取消了tableView的触摸。 你可以用

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];
       }];
}