UIView 对象中的 UIGestureRecognizer
Posted
技术标签:
【中文标题】UIView 对象中的 UIGestureRecognizer【英文标题】:UIGestureRecognizer in UIView Object 【发布时间】:2011-06-29 12:52:59 【问题描述】:我创建了一个UIViewController
,其中包含一个UIView
对象。
我希望 UIView
对象响应 1 根手指的单击以及 2 根手指的捏合。
我点击了 xib 中的“启用用户交互”和“多点触控”选项。
我在UIView
函数initWithFrame: 中同时创建UITapGestureRecognizer
和UIPinchGestureRecognizer
,因为它是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
通常在UIViewController
的viewDidLoad
方法中完成。
【讨论】:
以上是关于UIView 对象中的 UIGestureRecognizer的主要内容,如果未能解决你的问题,请参考以下文章
nib 中的 UIView 在 iPad 上是 nil,在 iPhone 上不是 nil
将 UIView 或 UIViewController 用于计时器对象?