以前有类似的问题,我已经提到
Capturing touches on a subview outside the frame of its superview using hitTest:withEvent:和
Delivering touch events to a view outside the bounds of its parent view.但他们似乎没有回答我的特殊问题.
我有一个具有以下结构的自定义控件:
+-------------------------------+ | UIButton | +-------------------------------+ | | | | | UITableView | | | | | +------------------------- +
自定义控件覆盖UIButton子类,并将UITableView作为其子视图添加.这个想法是让整个控制像一个下拉菜单.当UIButton被按下时,UITableView将会下拉并选择一个选项.
如果控件是最上面的UIView的直接孩子,这一切都适用于在UIButton中重击的hitTest,如Apple的上述Q&A A链接所述.但是,如果控件位于另一个视图层次结构中,则UITableView不会接收触摸事件.
以下是使用的hitTest代码:
override func hitTest(point: CGPoint,withEvent event: UIEvent?) -> UIView? { // Convert the point to the target view's coordinate system. // The target view isn't necessarily the immediate subview let pointForTargetView = self.spinnerTableView.convertPoint(point,fromView:self) if (CGRectContainsPoint(self.spinnerTableView.bounds,pointForTargetView)) { // The target view may have its view hierarchy,// so call its hitTest method to return the right hit-test view return self.spinnerTableView.hitTest(pointForTargetView,withEvent:event); } return super.hitTest(point,withEvent: event) }
编辑:
对于没有能够查看答案并检查是否解决问题,由于需要立即关注的其他一些任务,我们深表歉意.我会检查一下,接受一个帮助.谢谢你的耐心.
解决方法
正如你所说:
However,if the control is in another view hierarchy,the UITableView
is not receiving touch events.
即使你使它工作,如果你已经在另一个UIView?
这样我们有一个为视图层次结构转换点的负担,我的建议是,如您在this control中可以看到的,它将表视图添加到控件本身存在的同一层次结构中. (例如,它在添加了该控件的控制器上添加表视图)
链接的一部分:
-(void)textFieldDidBeginEditing:(UITextField *)textField { [self setupSuggestionList]; [suggestionListView setHidden:NO]; // Add list to the super view. if(self.dataSourceDelegate && [self.dataSourceDelegate isKindOfClass:UIViewController.class]) { [((UIViewController *)self.dataSourceDelegate).view addSubview:suggestionListView]; } // Setup list as per the given direction [self adjustListFrameForDirection:dropDownDirection]; }
希望有帮助!