显示视图时 UITableView 变为非活动状态
Posted
技术标签:
【中文标题】显示视图时 UITableView 变为非活动状态【英文标题】:UITableView becomes inactive when a view is shown 【发布时间】:2016-08-22 06:05:53 【问题描述】:我有一个UITableView
,每个单元格中都有一些值。接下来我有一个UIView
,当用户点击单元格中的任何一个时会显示它。现在我想要做的是允许用户选择多个单元格并能够滚动UITableView
,但是每当显示UIView
时,UITableView
就会以某种方式变为非活动状态。 UITableView
的 setUserInteractionEnabled
在任何地方都不会被禁用,所以这不是问题。这是用于在用户点击单元格时显示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) 中变为非活动状态