我一直在试图弄清楚这一点了几个小时,完全在这里的损失。 我想实现一个UIPinchGestureRecognizer
一些在我的游戏定制的UIImageViews的,但它不工作。 我研究的一切事情表示,它应该工作,但事实并非如此。 如果我把它添加到我的视图控制器,或自定义的UIView,但不是捏的UIImageViews正常工作。 我已经尝试了所有常见的修复和调整,对没有成功。 我已经userInteractionEnabled
和multipleTouchEnabled
设置为YES。 我有委托和选择正确设置。 我有shouldRecognizeSimultaneouslyWithGestureRecognizer
设置返回YES。
手势识别是越来越加入的UIImageView,我已经能够在稍后访问我的更新循环的属性,但在NSLog的选择不会被调用为的UIImageView,当我试图掐。 我已经调整的意见z位置,以确保他们在顶部,但没有骰子。
我的UIImageViews被存储在一个的NSMutableDictionary和游戏的每个更新循环过程中,通过其循环更新。 ?难道这对UIPinchGestureRecognizer没有得到所谓的效果......我想不出别的和张贴的代码可能不会帮助 - 因为当它用于UIView的或视图控制器完全相同的代码工作。
我有在视图控制器的touchesBegan和touchedMoved触摸事件处理代码...但我已经变成其关闭,但问题依然存在,并捏工作了与它的其他元素反正。
任何想法可能防止手势选择从射击上的UIImageView? 词典? 事做在游戏圈正在不断更新? 任何想法将受到欢迎,这似乎很简单实现...
编辑:这是对的UIImageView的代码,我正在用它做...不知道如果这有助于。
扩展UIImageView类Paper.m(PRP是一个struct
用来初始化我的自定义变量属性:
NSString *tName = [NSString stringWithUTF8String: prp.imagePath];
UIImage *tImage = [UIImage imageNamed:[NSString stringWithFormat:@"%@.png",tName]];
self = [self initWithImage: tImage];
self.userInteractionEnabled = YES;
self.multipleTouchEnabled = YES;
self.center = CGPointMake(prp.spawnX, prp.spawnY);
if (prp.zPos != 0) { self.layer.zPosition = prp.zPos; }
// other initialization excised
然后,我有叫ObjManager一个自定义类,持有的NSMutableDictionary和初始化所有的UIImageView对象,像这样,在addObj被称为在循环中添加的每个对象:
- (ObjManager*) initWithBlank {
// create an array for our objects
self = [super init];
if (self) {
objects = [[NSMutableDictionary alloc] init];
spawnID = 100; // start of counter for dynamically spawned object IDs
}
return self;
}
- (void) addObj:(Paper *)paperPiece wasSpawned:(BOOL)spawned {
// add each paper piece, assign spawnID if dynamically spawned
NSNumber *newID;
if (spawned) { newID = [NSNumber numberWithInt:spawnID]; spawnID++; }
else { newID = [NSNumber numberWithInt:paperPiece.objID]; }
[objects setObject:paperPiece forKey:newID];
}
我的视图控制器调用ObjManager(称为_world在我的VC)的初始化。 然后,它遍历像这样_world:
// Populate additional object managers and add all subviews
for (NSNumber *key in _world.objects) {
_eachPiece = [_world.objects objectForKey:key];
// Populate collision object manager
if (_eachPiece.collision) {
[_world_collisions addObj:_eachPiece wasSpawned:NO];
}
// only add pinch gesture if the object flag is set
if (_eachPiece.pinch) {
UIPinchGestureRecognizer *pinchGesture = [[UIPinchGestureRecognizer alloc] initWithTarget:self action:@selector(pinchPaper:)];
pinchGesture.delegate = self;
[_eachPiece addGestureRecognizer:pinchGesture];
NSLog(@"Added pinch recognizer scale: %@", pinchGesture.view.description);
}
// Add each object as a subview
[self.view addSubview:_eachPiece];
}
_eachPiece是在我的视图控制器,在.h文件中声明的对象(如_world):
@property (nonatomic, strong) ObjManager *world;
@property (nonatomic, strong) Paper *eachPiece;
然后,我有一个NSTimer对象,更新_world所有可移动的纸对象(的UIImageViews)(ObjManager)像这样每一帧:
// loop through each piece and update
for (NSNumber *key in _world.objects) {
eachPiece = [_world.objects objectForKey:key];
// only update moveable pieces
if ((eachPiece.moveType == Move_Touch) || (eachPiece.moveType == Move_Auto)) {
CGPoint paperCenter;
paperCenter = eachPiece.center;
// a bunch of code to update paperCenter x & y for the object's new position based on velocity and user input
// determine image direction and transformation matrix
[_world updateDirection:eachPiece];
CGAffineTransform transformPiece = [_world imageTransform:eachPiece];
if (transformEnabled) {
eachPiece.transform = transformPiece;
}
// finally move it
[eachPiece setCenter:paperCenter];
}
}
和夹选择:
- (void)pinchPaper:(UIPinchGestureRecognizer *)recognizer {
NSLog(@"Pinch scale: %f", recognizer.scale);
recognizer.view.transform = CGAffineTransformScale(recognizer.view.transform, recognizer.scale, recognizer.scale);
recognizer.scale = 1;
}
据我所知道的,捏应该工作。 如果我采取相同的缩放手势代码并将其设置为添加到视图控制器,它适用于整个视图。 我也有一个自定义UIView类充当边框(简单地围绕视图绘制一个矩形),并且缩放手势代码移动,让我只掐的边界。