我的自定义 UIView 没有收到触摸
Posted
技术标签:
【中文标题】我的自定义 UIView 没有收到触摸【英文标题】:My custom UIView dos not receive touches 【发布时间】:2013-04-21 14:17:11 【问题描述】:使用 IB,我创建了一个包含几个按钮的小子视图。我的控制器从 xib 文件中读取小视图并将其作为子视图添加到主视图中。它加载正常,我可以看到子视图及其所有按钮。据我所知,它还连接到控制器中的 IBOutlets 和 IBActions。
但是,当我按下按钮时,什么也没有发生!事实上,当我按下一个按钮超级视图的 touchesBegan 被调用! 超级视图还包含一个“普通按钮”(即我的子视图的兄弟),并且该按钮可以正常工作!问题:为什么我的子视图上的按钮不起作用?
-(void) loadMultibutt
self.buttErase = nil; // test if the outlet connects
NSArray *arr = [[NSBundle mainBundle]
loadNibNamed:@"multibutt_ipad" owner:self options:nil];
UIView *viewButts = [arr objectAtIndex:0];
ViewWorkbench* vw = (ViewWorkbench*) self.view;
[vw addMultibuttView:viewButts];
// now, buttErase != nil.
NSSet *setTest = [self.buttErase allTargets];
NSLog(@"setTest = %@", setTest); // This works!
【问题讨论】:
您是否启用了用户交互 - 在 xib 文件中或通过设置 UIView 属性 userInteractionEnabled? @CharliePrice 是的,在 xib 文件中启用了用户交互。 检查 UIView 的大小。可能是它的大小小于其中的内容(子视图),并且您没有剪切它。这允许您查看所有子视图,但您将无法与它们进行交互。试试这个 [theView setClipsToBounds:YES];并检查您是否仍然看到子视图。如果你不这样做,就是这样。如果是这样,只需在 IBuilder 上将其放大即可。 @sEnC 谢谢,我必须深入研究这个!当我调用 [theView setClipsToBounds:YES]; 时,所有按钮都变得不可见; !不过,视图的框架大小正是它应该的大小 (110x184),大到足以容纳按钮... 【参考方案1】:根据您的回复,我可以安全地得出结论,您的问题是按钮的父视图不包含其交互区域中的按钮。您仍然可以看到它们,因为您没有剪切子视图,但您仍然无法与它们交互。有两种方法可以解决您的问题
a)(推荐)将按钮放置在适当的位置,以便它们在可见(和父视图的交互区域)内
b) 覆盖父视图的 hitTest 选择器,以便它跟踪其子视图中的所有触摸,包括其边界之外的触摸。为此,您必须创建 UIView 的子类并实现以下内容:
-(UIView *) hitTest:(CGPoint)point withEvent:(UIEvent *)event
UIView* result = [super hitTest:point withEvent:event];
if (result)
return result;
for (UIView* sub in [self.subviews reverseObjectEnumerator])
CGPoint pt = [self convertPoint:point toView:sub];
result = [sub hitTest:pt withEvent:event];
if (result)
return result;
return nil;
【讨论】:
是的,问题出在按钮父视图上。当我设置那个视图的前景色时,我只能看到一小块区域的颜色,剩下的部分是透明的,只有彩色部分是活动的。我通过取消选择 IB 中自动调整大小框中的每一行来解决问题。谢谢!以上是关于我的自定义 UIView 没有收到触摸的主要内容,如果未能解决你的问题,请参考以下文章
MVC:我应该在 View Controller 或 UIView 的自定义子类中添加和实现触摸手势吗
为啥设置 backgroundColor 对我的自定义 UIView 没有明显影响?
使用 iCarousel 时,我的自定义 UIView 显示但里面啥都没有?