包含 UILabel 和 UIButton 的 UICollectionViewCell 无法识别对一半单元格的触摸

Posted

技术标签:

【中文标题】包含 UILabel 和 UIButton 的 UICollectionViewCell 无法识别对一半单元格的触摸【英文标题】:UICollectionViewCell which contains a UILabel and UIButton not recognizing touches on half the cell 【发布时间】:2014-07-27 05:21:31 【问题描述】:

我已将 UILabel 和 UIButton 添加到 UICollectionViewCell,但是当触摸/点击单元格时,它只会在单元格的左半边注册我的点击。忽略单元格右半部分的任何触摸/点击?我还应该注意,文本在 UILabel 中的长度并不重要。

示例文本:

@"Short     text"
@"Very long text does not matter"

在上面的文本中,触摸停止在“text”中最后一个“t”的位置。

代码:

    - (id)initWithFrame:(CGRect)frame
    
        self = [super initWithFrame:frame];
        if (self) 
            self.clipsToBounds = YES;

            myLabel = [[UILabel alloc] initWithFrame:self.bounds];
            myLabel.frame = UIEdgeInsetsInsetRect(myLabel.frame, UIEdgeInsetsMake(0, SEARCH_CELL_PADDING, 0, SEARCH_CELL_PADDING +30));
            myLabel.textAlignment = NSTextAlignmentLeft;
            myLabel.autoresizingMask = UIViewAutoresizingFlexibleHeight | UIViewAutoresizingFlexibleWidth;
            myLabel.font = RECENT_SEARCH_CELL_FONT;
            myLabel.textColor = WK_COLOR_GRAY_77;

            myButton = [[UIButton alloc] initWithFrame:CGRectMake(0, 0, self.bounds.size.width, 30)];
            myButton.autoresizingMask = UIViewAutoresizingFlexibleHeight | UIViewAutoresizingFlexibleWidth;
            UIImage *btnImage = [UIImage imageNamed:@"icon2.png"];
            [myButton setImage:btnImage forState:UIControlStateNormal];
            UIImage *btnSelectedImage = [UIImage imageNamed:@"icon.png"];
            [myButton setImage:btnSelectedImage forState:UIControlStateSelected];
            [myButton setUserInteractionEnabled:NO];

            [self addSubview:myButton];
            [self addSubview:myLabel];

        
        return self;
    

可能是单元格中的偏移量或 uicollectionview 设置中的偏移量?

更新:

我添加了以下代码,并且从未调用过 tap 方法。

 UITapGestureRecognizer *tapGesture =
    [[UITapGestureRecognizer alloc] initWithTarget:self action:@selector(labelTap)];
    [_recentSearchLabel addGestureRecognizer:tapGesture];

我也把上面的代码改成如下:

- (id)initWithFrame:(CGRect)frame
    
        self = [super initWithFrame:frame];
        if (self) 
            self.clipsToBounds = YES;

            myLabel = [[UILabel alloc] initWithFrame:self.bounds];
            myLabel.frame = UIEdgeInsetsInsetRect(myLabel.frame, UIEdgeInsetsMake(0, SEARCH_CELL_PADDING, 0, SEARCH_CELL_PADDING +30));
            myLabel.textAlignment = NSTextAlignmentLeft;
            myLabel.autoresizingMask = UIViewAutoresizingFlexibleHeight | UIViewAutoresizingFlexibleWidth;
            myLabel.font = RECENT_SEARCH_CELL_FONT;
            myLabel.textColor = WK_COLOR_GRAY_77;

            myButton = [[UIButton alloc] initWithFrame:CGRectMake(0, 0, self.bounds.size.width, 30)];
            myButton.autoresizingMask = UIViewAutoresizingFlexibleHeight | UIViewAutoresizingFlexibleWidth;
            UIImage *btnImage = [UIImage imageNamed:@"icon2.png"];
            [myButton setImage:btnImage forState:UIControlStateNormal];
            UIImage *btnSelectedImage = [UIImage imageNamed:@"icon.png"];
            [myButton setImage:btnSelectedImage forState:UIControlStateSelected];
            [myButton setUserInteractionEnabled:YES];

            [self addSubview:myLabel];
            [self addSubview:myButton];


        
        return self;
    

仍然工作

【问题讨论】:

您可以尝试将背景颜色添加到子视图和集合视图单元格以检查边界吗? 为什么这行:[myButton setUserInteractionEnabled:NO];? 我在所有子视图(标签、按钮等)上设置了背景颜色,标签现在位于顶部,@santhosh,但它仍然无法识别触摸。而且我还更改了 setUserInteractionEnabled:YES。没有变化。 【参考方案1】:

替换上面的代码: [自我 addSubview:myButton]; [self addSubview:myLabel];

有: [自我 addSubview:myLabel]; [self addSubview:myButton];

由于您将按钮作为子视图添加到视图中,因此在将该标签添加为可能与按钮位置重叠的子视图之后。所以首先添加“标签”作为子视图,然后添加“按钮”。巴顿现在将采取行动。

希望这能解决您的问题。 .干杯:)

【讨论】:

将第一个标签添加为子视图,然后添加按钮。在您的代码中,您首先添加“按钮”,然后添加“标签”。【参考方案2】:

问题是 collectionview 不够宽,但不知何故,单元格从 collectionviews 视图中射出一半。所以单元格一半在collectionview上,一半在collectionview上。关闭的一半没有识别触摸。

【讨论】:

以上是关于包含 UILabel 和 UIButton 的 UICollectionViewCell 无法识别对一半单元格的触摸的主要内容,如果未能解决你的问题,请参考以下文章

只需要修复 UIButton 和 UILabel 的自动布局问题

使用时间和动画从字符串数组中更改 UILabel/UIButton 文本

UILabel 和 UIButton - 截断标签而不是按钮

在 UILabel 之后制作 UIButton Wrap

UILabel 阻止 UIButton 显示,直到您从调试视图层次结构继续

UIButton中图像下的标签