UIView 对象中的 UIGestureRecognizer

Posted

技术标签:

【中文标题】UIView 对象中的 UIGestureRecognizer【英文标题】:UIGestureRecognizer in UIView Object 【发布时间】:2011-06-29 12:52:59 【问题描述】:

我创建了一个UIViewController,其中包含一个UIView 对象。

我希望 UIView 对象响应 1 根手指的单击以及 2 根手指的捏合。

我点击了 xib 中的“启用用户交互”“多点触控”选项。

我在UIView 函数initWithFrame: 中同时创建UITapGestureRecognizerUIPinchGestureRecognizer,因为它是UIView 对象的唯一入口点。但该对象不响应 UIGestureRecognizer 对象。为什么?或者,放置UIGestureRecognizer 对象的最佳位置在哪里?

- (id)initWithFrame:(CGRect)frame

    self = [super initWithFrame:frame];
    if (self) 
        // Initialization code
        // single tap
        UITapGestureRecognizer* singleTap = [[UITapGestureRecognizer alloc] initWithTarget:self action:@selector(handleSingleTap:)];

        singleTap.numberOfTapsRequired = 1;
        singleTap.numberOfTouchesRequired = 1;
        [self addGestureRecognizer: singleTap];

        // 2 fingers pinch
        UIPinchGestureRecognizer* doubleMove = [[UIPinchGestureRecognizer alloc] initWithTarget:self action:@selector(handleDoubleMove:)];

        [self addGestureRecognizer: doubleMove];
    
    return self;

【问题讨论】:

单独的问题,但您需要在addGestureRecognizer: 调用之后release 手势识别器。 谢谢。我正在使用 XCode 4.2,它使用 ARC,当我尝试释放/自动释放任何对象时,编译器会给我错误。我对以前使用最新编译器所做的事情感到非常困惑。 好吧,没关系。还不习惯“丢失”版本。 【参考方案1】:

您的问题是,当您在 IB 中实例化自定义视图子类时,会调用 initWithCoder:。如果您使用initWithFrame: 以编程方式完成它,它会正常工作。

有两种方法可以解决这个问题,

    将手势设置移动到不同的方法并在initWithFrame:initWithCoder: 中调用它们。如果您打算重用此组件并在手势上公开某种回调,我建议您这样做。

    如果您想实现一次并与控制器元素进行大量交互,请将它们添加到viewDidLoad

【讨论】:

UIView 没有 viewDidLoad【参考方案2】:

我试过你的代码,它对我有用。

你在哪里设置视图?也许它前面有任何其他视图,或者它的父视图禁用了userInteractionEnabled

我创建了一个 UIView 子类并添加了以下代码:

-(void) handleSingleTap:(UITapGestureRecognizer *)gr 
    NSLog(@"handleSingleTap");


-(void) handleDoubleMove:(UIPinchGestureRecognizer *)gr 
    NSLog(@"handleDoubleMove");


- (id)initWithFrame:(CGRect)frame

    self = [super initWithFrame:frame];
    if (self) 
        // Initialization code
        // single tap
        UITapGestureRecognizer* singleTap = [[UITapGestureRecognizer alloc] initWithTarget:self action:@selector(handleSingleTap:)];

        singleTap.numberOfTapsRequired = 1;
        singleTap.numberOfTouchesRequired = 1;
        [self addGestureRecognizer: singleTap];

        // 2 fingers pinch
        UIPinchGestureRecognizer* doubleMove = [[UIPinchGestureRecognizer alloc] initWithTarget:self action:@selector(handleDoubleMove:)];

        [self addGestureRecognizer: doubleMove];
    
    return self;

然后,在我的控制器中:

-(void) viewDidLoad 
    [super viewDidLoad];

    MyView * myView = [[MyView alloc] initWithFrame:CGRectMake(0, 0, 100, 100)];
    myView.backgroundColor = [UIColor greenColor];
    [self.view addSubview:myView];
    [myView release];


而且它有效。

【讨论】:

【参考方案3】:

我认为如果你正在使用.xib,初始化也可以在

中完成

-(void)awakeFormNib;

【讨论】:

【参考方案4】:

添加GestureRecognizers 通常在UIViewControllerviewDidLoad 方法中完成。

【讨论】:

以上是关于UIView 对象中的 UIGestureRecognizer的主要内容,如果未能解决你的问题,请参考以下文章

从子视图中的路径对象在 UIView 中构建剪辑区域

同一 UIView 对象的多个实例的问题

nib 中的 UIView 在 iPad 上是 nil,在 iPhone 上不是 nil

将 UIView 或 UIViewController 用于计时器对象?

Swift 中的 UIScrollView 内的 UIPanGesture

在视图控制器上放置无限的uiview对象数组[关闭]