UIPinchGestureRecognizer选择没有得到要求的UIImageView(UIPin

2019-10-29 06:32发布

我一直在试图弄清楚这一点了几个小时,完全在这里的损失。 我想实现一个UIPinchGestureRecognizer一些在我的游戏定制的UIImageViews的,但它不工作。 我研究的一切事情表示,它应该工作,但事实并非如此。 如果我把它添加到我的视图控制器,或自定义的UIView,但不是捏的UIImageViews正常工作。 我已经尝试了所有常见的修复和调整,对没有成功。 我已经userInteractionEnabledmultipleTouchEnabled设置为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类充当边框(简单地围绕视图绘制一个矩形),并且缩放手势代码移动,让我只掐的边界。

Answer 1:

好了,所以显然手势识别不火在哪里的位置被动画的看法。 因此,要使它工作,我不得不把识别视图控制器上,然后执行命中测试和触摸视图应用捏/变焦,如果它是一个我想捏/变焦。 在这里信息:

http://iphonedevsdk.com/forum/iphone-sdk-tutorials/100982-caanimation-tutorial.html

对于我的具体情况,我一直在跟踪它的动画意见,我想捏,在视图控制器级别的变量/数组。 然后,我在选择(基本上从上面的链接,所有争光)使用此代码:

- (void)pinchPaper:(UIPinchGestureRecognizer *)recognizer {

    CALayer *pinchLayer;
    id layerDelegate;
    CGPoint touchPoint = [recognizer locationInView:self.view];

    pinchLayer = [self.view.layer.presentationLayer hitTest: touchPoint];
    layerDelegate = [pinchLayer delegate];

    //_pinchView is the UIView I want to pinch
    if (layerDelegate == _pinchView) {
        _pinchView.transform = CGAffineTransformScale(_pinchView.transform, recognizer.scale, recognizer.scale);
        recognizer.scale = 1;
    }
}

只有一件棘手的事情是,如果你有其他的缩放变换(如在我的改变方向)仍在进行中,现有的UIView动画的一部分,你必须考虑到的是,通过使用每个更新循环期间的电流变换。



Answer 2:

对于任何手势识别对imageViews工作,用户交互,要在启用。

所以,它应该是,

yourImageView.userInteractionEnabled = YES;

或者,如果您使用的是故事板,您就可以在故事板的检查窗口的选择了。

希望能帮助到你..:)



文章来源: UIPinchGestureRecognizer selector not getting called on UIImageView