gpt4 book ai didi

ios - UIPinchGestureRecognizer 选择器未在 UIImageView 上调用

转载 作者:行者123 更新时间:2023-11-28 20:26:39 25 4
gpt4 key购买 nike

几个小时以来,我一直在努力解决这个问题,但在这里完全不知所措。我正在尝试为游戏中的一些自定义 UIImageView 实现 UIPinchGestureRecognizer,但它不起作用。我研究过的所有东西都说它应该有效,但事实并非如此。如果我将它添加到我的 View Controller 或自定义 UIView,而不是 UIImageViews,Pinch 工作正常。我已经尝试了所有常见的修复和调整,但没有成功。我将 userInteractionEnabledmultipleTouchEnabled 设置为 YES。我已正确设置委托(delegate)和选择器。我将 shouldRecognizeSimultaneouslyWithGestureRecognizer 设置为返回 YES。

手势识别器被添加到 UIImageView,我稍后可以在我的更新循环中访问它的属性,但是当我尝试捏合时,选择器中的 NSLog 永远不会为 UIImageView 调用。我已经调整了 View 的 z 位置以确保它们位于顶部但没有骰子。

我的 UIImageViews 存储在 NSMutableDictionary 中,并在游戏的每个更新循环中通过循环更新它。这会对 UIPinchGestureRecognizer 没有被调用产生影响吗?...我想不出其他任何东西,发布代码可能无济于事 - 因为相同的代码在用于 UIView 或 View Controller 时有效。

我在 View Controller 的 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];
}

我的 View Controller 调用 ObjManager 的初始化(在我的 VC 中称为 _world)。然后它像这样循环遍历 _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 是我的 View Controller 中的一个对象,在 .h 文件中声明(与 _world 一样):

@property (nonatomic, strong) ObjManager *world; 
@property (nonatomic, strong) Paper *eachPiece;

然后我有一个 NSTimer 对象,它像这样每帧更新 _world (ObjManager) 中所有可移动的 Paper 对象(UIImageViews):

// 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;
}

据我所知,捏应该有用。如果我采用相同的捏合手势代码并将其设置为添加到 View Controller ,则它适用于整个 View 。我还有一个用作边框的自定义 UIView 类(只是在 View 周围绘制的一个矩形),并将捏合手势代码移动到该代码允许我仅捏合边框。

最佳答案

好吧,显然手势识别器不会在位置动画的 View 上触发。因此,为了使其正常工作,我必须将识别器放在 View Controller 上,然后执行 HitTest 并在触摸的 View 上应用捏合/缩放(如果我想要捏合/缩放)。此处的相关信息:

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

对于我的特殊情况,我在 View Controller 级别的变量/数组中跟踪我想要捏合的动画 View 。然后我在选择器中使用了这段代码(基本上来自上面的链接,所有功劳都归功于他们):

- (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 动画的一部分,您必须通过在每个更新循环期间使用当前变换来考虑这一点。

关于ios - UIPinchGestureRecognizer 选择器未在 UIImageView 上调用,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/13680045/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com