首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >UIControl未收到请求

UIControl未收到请求
EN

Stack Overflow用户
提问于 2012-02-19 22:28:45
回答 8查看 14.9K关注 0票数 28

我有一个实现touches began方法的UIControl,如下所示:

代码语言:javascript
复制
- (void)touchesBegan:(NSSet *)touches withEvent:(UIEvent *)event
{
    [super touchesBegan:touches withEvent:event];
    //More code goes here

UIControl的这个子类在视图控制器中实例化,然后作为子视图添加到该视图控制器。我在UIControl的touches began方法处有一个断点,该方法永远不会被调用。我已经做了一些阅读,似乎视图控制器有一些逻辑来决定是否将触摸事件传递给它的子视图。奇怪的是,我在同一个视图控制器中有一个不同的UIControl子类,当用户触摸它时,触摸事件会传递给它!下面是完整的代码:

.h

代码语言:javascript
复制
#import <UIKit/UIKit.h>

@interface CustomSegment : UIView
@property (nonatomic, strong) UIImageView *bgImageView;
@property (nonatomic, assign) NSInteger segments;
@property (nonatomic, strong) NSArray *touchDownImages;
@property (nonatomic, readonly, assign) NSInteger selectedIndex;
@property (nonatomic, weak) id delegate;


- (id)initWithPoint:(CGPoint)point numberOfSegments:(NSInteger)_segments andTouchDownImages:(NSArray *)_touchDownImages;
- (void)touchesBegan:(NSSet *)touches withEvent:(UIEvent *)event;
@end

.m

代码语言:javascript
复制
#import "CustomSegment.h"

@implementation CustomSegment
@synthesize bgImageView, segments, touchDownImages, selectedIndex, delegate;

- (id)initWithPoint:(CGPoint)point
   numberOfSegments:(NSInteger)_segments
           andTouchDownImages:(NSArray *)_touchDownImages  
{  
    self = [super initWithFrame:CGRectMake(point.x, point.y, [[_touchDownImages     objectAtIndex:0] size].width, [[touchDownImages objectAtIndex:0] size].height)];
if (self)
{
    touchDownImages = _touchDownImages;
    segments = _segments;
    bgImageView = [[UIImageView alloc] initWithImage:[touchDownImages objectAtIndex:0]];
    [self addSubview:bgImageView];
}
return self;
}

- (BOOL)beginTrackingWithTouch:(UITouch *)touch withEvent:(UIEvent *)event
{
    return YES;  
}
- (void)touchesBegan:(NSSet *)touches withEvent:(UIEvent *)event
{
    //[super touchesBegan:touches withEvent:event];
    UITouch *touch = [touches anyObject];
    float widthOfSegment = [self frame].size.width / segments;
    float bottomPoint = 0;
    float topPoint = widthOfSegment;
    for (int i = 0; i < segments; i++)
    {
        if ([touch locationInView:self].x > bottomPoint && [touch locationInView:self].x < topPoint)
        {
            [bgImageView setImage:[touchDownImages objectAtIndex:i]];
            selectedIndex = i;
            return;
        }
        else
        {
            bottomPoint = topPoint;
            topPoint += topPoint;
        }
    }
}
@end
EN

回答 8

Stack Overflow用户

回答已采纳

发布于 2012-05-16 22:41:27

tl;dr将UIControl的所有子视图设置为setUserInteractionEnabled:NO。默认情况下,UIImageViews将其设置为NO

原创帖子

我最近发现的一件事是,如果UIControl的最顶层子视图具有setUserInteractionEnabled:NO,则会有所帮助。我之所以这样做,是因为我有一个带有UIImageView的UIControl子类,因为它只是一个子视图,它工作得很好。默认情况下,UIImageView将userInteractionEnabled设置为NO

我还有另一个带有UIView的UIControl,它是最顶层的子视图(从技术上讲,不同状态下的相同UIControl )。我相信UIView默认使用userInteractionEnabled == YES,这就排除了UIControl正在处理的事件。将my视图的userInteractionEnabled设置为NO解决了我的问题。

我不知道这里是不是也有同样的问题,但也许这会有所帮助?

--编辑:当我说最上面的视图时...可能会将UIControl的所有子视图设置为setUserInteractionEnabled:NO

票数 103
EN

Stack Overflow用户

发布于 2012-02-19 23:26:55

检查所有父视图的frame。规则是,如果视图的子视图(或其部分)在视图边界之外,它不会接收触摸事件。

票数 2
EN

Stack Overflow用户

发布于 2012-02-19 22:38:07

有可能另一个视图正在覆盖您的UIControl,并阻止它接收触摸事件。另一种可能是userInteractionEnabled被错误地设置为NO

编辑:我看到你在上面添加了更多的代码。您是否验证了视图框架的宽度和高度大于零?在我看来,你是直接在NSArray的一个对象上调用"size“(即”id“)。我不知道你是如何在没有造型的情况下做到这一点的(也许上面的括号没有通过?)但是如果你以某种方式把它拉出来,如果它是一个无效值,我也不会感到惊讶。

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/9350041

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档