我的自定义 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 显示但里面啥都没有?

我的自定义 UIView 没有显示在屏幕上

为啥在我的自定义 UIView 类中没有调用 init(frame: CGRect)?

如何从 UITableViewCell 中的自定义 UIButton 中删除触摸延迟