【问题标题】:UIGestureRecognizer in UIView ObjectUIView 对象中的 UIGestureRecognizer
【发布时间】: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,当我尝试释放/自动释放任何对象时,编译器会给我错误。我对以前使用最新编译器所做的事情感到非常困惑。
  • 好吧,没关系。还不习惯“丢失”版本。

标签: ios uiview uigesturerecognizer


【解决方案1】:

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

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

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

  2. 如果您想实现一次并与控制器元素进行大量交互,请将它们添加到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 方法中完成。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2017-10-06
        • 2019-10-16
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多