- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
几个小时以来,我一直在努力解决这个问题,但在这里完全不知所措。我正在尝试为游戏中的一些自定义 UIImageView 实现 UIPinchGestureRecognizer
,但它不起作用。我研究过的所有东西都说它应该有效,但事实并非如此。如果我将它添加到我的 View Controller 或自定义 UIView,而不是 UIImageViews,Pinch 工作正常。我已经尝试了所有常见的修复和调整,但没有成功。我将 userInteractionEnabled
和 multipleTouchEnabled
设置为 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/
IO 设备如何知道属于它的内存中的值在memory mapped IO 中发生了变化? ? 例如,假设内存地址 0 专用于保存 VGA 设备的背景颜色。当我们更改 memory[0] 中的值时,VGA
我目前正在开发一个使用Facebook sdk登录(通过FBLoginView)的iOS应用。 一切正常,除了那些拥有较旧版本的facebook的人。 当他们按下“使用Facebook登录”按钮时,他
假设我有: this - is an - example - with some - dashesNSRange将使用`rangeOfString:@“-”拾取“-”的第一个实例,但是如果我只想要最后
Card.io SDK提供以下详细信息: 卡号,有效期,月份,年份,CVV和邮政编码。 如何从此SDK获取国家名称。 - (void)userDidProvideCreditCardInfo:(Car
iOS 应用程序如何从网络服务下载图片并在安装过程中将它们安装到用户的 iOS 设备上?可能吗? 最佳答案 您无法控制应用在用户设备上的安装,因此无法在安装过程中下载其他数据。 只需在安装后首次启动应
我曾经开发过一款企业版 iOS 产品,我们公司曾将其出售给大型企业,供他们的员工使用。 该应用程序通过 AppStore 提供,企业用户获得了公司特定的配置文件(包含应用程序配置文件)以启用他们有权使
我正在尝试将 Card.io SDK 集成到我的 iOS 应用程序中。我想为 CardIO ui 做一个简单的本地化,如更改取消按钮标题或“在此保留信用卡”提示文本。 我在 github 上找到了这个
我正在使用 CardIOView 和 CardIOViewDelegate 类,没有可以设置为 YES 的 BOOL 来扫描 collectCardholderName。我可以看到它在 CardIOP
我有一个集成了通话工具包的 voip 应用程序。每次我从我的 voip 应用程序调用时,都会在 native 电话应用程序中创建一个新的最近通话记录。我在 voip 应用程序中也有自定义联系人(电话应
iOS 应用程序如何知道应用程序打开时屏幕上是否已经有键盘?应用程序运行后,它可以接收键盘显示/隐藏通知。但是,如果应用程序在分屏模式下作为辅助应用程序打开,而主应用程序已经显示键盘,则辅助应用程序不
我在模拟器中收到以下错误: ImageIO: CGImageReadSessionGetCachedImageBlockData *** CGImageReadSessionGetCachedIm
如 Apple 文档所示,可以通过 EAAccessory Framework 与经过认证的配件(由 Apple 认证)进行通信。但是我有点困惑,因为一些帖子告诉我它也可以通过 CoreBluetoo
尽管现在的调试器已经很不错了,但有时找出应用程序中正在发生的事情的最好方法仍然是古老的 NSLog。当您连接到计算机时,这样做很容易; Xcode 会帮助弹出日志查看器面板,然后就可以了。当您不在办公
在我的 iOS 应用程序中,我定义了一些兴趣点。其中一些有一个 Kontakt.io 信标的名称,它绑定(bind)到一个特定的 PoI(我的意思是通常贴在信标标签上的名称)。现在我想在附近发现信标,
我正在为警报提示创建一个 trigger.io 插件。尝试从警报提示返回数据。这是我的代码: // Prompt + (void)show_prompt:(ForgeTask*)task{
您好,我是 Apple iOS 的新手。我阅读并搜索了很多关于推送通知的文章,但我没有发现任何关于 APNS 从 io4 到 ios 6 的新更新的信息。任何人都可以向我提供 APNS 如何在 ios
UITabBar 的高度似乎在 iOS 7 和 8/9/10/11 之间发生了变化。我发布这个问题是为了让其他人轻松找到答案。 那么:在 iPhone 和 iPad 上的 iOS 8/9/10/11
我想我可以针对不同的 iOS 版本使用不同的 Storyboard。 由于 UI 的差异,我将创建下一个 Storyboard: Main_iPhone.storyboard Main_iPad.st
我正在写一些东西,我将使用设备的 iTunes 库中的一部分音轨来覆盖 2 个视频的组合,例如: AVMutableComposition* mixComposition = [[AVMutableC
我创建了一个简单的 iOS 程序,可以顺利编译并在 iPad 模拟器上运行良好。当我告诉 XCode 4 使用我连接的 iPad 设备时,无法编译相同的程序。问题似乎是当我尝试使用附加的 iPad 时
我是一名优秀的程序员,十分优秀!