小编tod*_*412的帖子

如何捕获最初在UIPanGestureRecognizer中点击的点?

我有一个应用程序,让用户跟踪屏幕上的行.我是通过在UIPanGestureRecognizer中记录点来实现的:

-(void)handlePanFrom:(UIPanGestureRecognizer *)recognizer
{
    CGPoint pixelPos = [recognizer locationInView:rootViewController.glView];
    NSLog(@"recorded point %f,%f",pixelPos.x,pixelPos.y);
}
Run Code Online (Sandbox Code Playgroud)

这很好.但是,我对用户在开始平移之前点击的第一点非常感兴趣.但上面的代码只给出了手势被识别为平底锅的点数(相对于水龙头).

从文档中可以看出,可能没有简单的方法来确定UIPanGestureRecognizer API中最初挖掘的位置.虽然在UIPanGestureRecognizer.h中,我发现了这个声明:

CGPoint _firstScreenLocation;
Run Code Online (Sandbox Code Playgroud)

......似乎是私人的,所以没有运气.我正在考虑完全离开UIGestureRecognizer系统只是为了捕获那个初始点,然后在我知道用户确实已经开始UIPanGesture之后再回头看它.我想我会问这里,然后走这条路.

iphone objective-c pan uigesturerecognizer ios

23
推荐指数
4
解决办法
1万
查看次数

如何从多个超类继承自定义类?

我有一个iPhone应用程序,其中A类是UIViewController的子类:

在此输入图像描述

现在我正在创建一个新的应用程序,其中我想重用A,但是它有B的子类,这很好,因为来自UIViewController的B子类:

在此输入图像描述

但是现在我有另一个类C,它是GLKViewController的子类:

在此输入图像描述

当我尝试制作第三个重复使用B而不做任何更改的应用程序时,问题就来了.由于B继承自UIViewController,我需要以某种方式告诉C它应该继承自B GLKViewController,我认为这是多重继承的情况:

在此输入图像描述

从我正在阅读的内容来看,处理这个问题的最好方法是使用构图,但我不明白如何最好地将它应用到我的情况中.

作为一个替代解决方案,我意识到我可以创建一个包装器D,然后我可以逐个app地修改它从适当的超类继承用于手头的任务:

在此输入图像描述

在此输入图像描述

但这看起来有点像hacky.有一个更好的方法吗?

inheritance uiviewcontroller ios

9
推荐指数
1
解决办法
4705
查看次数

如何识别显示为空括号的空NSData对象?

我正在处理Game Kit的GKTurnBasedMatch类中的损坏问题(请参阅此主题),这有时会导致游戏状态无效,matchData损坏.

因此,作为一种解决方法,我正在创建一种方法来识别这些无效匹配,以便我可以适当地处理它们.损坏的matchData似乎是一种很好的方法.但是,到目前为止,我一直无法识别它们.当我这样做:

// "match" is an existing GKTurnBasedMatch object
NSLog(@"match data is: %@",[match matchData]);
NSLog(@"match data is nil? %@",[match matchData] == nil ? @"YES" : @"NO");
NSLog(@"match data equals empty nsdata? %@",[match matchData] == [NSData data] ? @"YES" : @"NO");
Run Code Online (Sandbox Code Playgroud)

我得到以下内容:

match data is: <>
match data is nil? NO
match data equals empty nsdata? NO
Run Code Online (Sandbox Code Playgroud)

所以匹配数据显示为一对空括号"<>",我希望可以将其标识为零,但显然不是.

顺便说一句,我将此matchData存储在NSData属性下的核心数据实体中.当我保存NSManagedObjectContext,然后NSLog NSManagedObject查看其中的内容时,有问题的NSData属性显示为"<>"!

但是,如果我然后创建一个新的 NSManagedObjectContext,从中检出相同的NSManagedObject,然后 NSLog其值,NSData属性现在显示为nil.

所以才出现,在某些时候,核心数据是"清洗"的属性,其波普尔值.我的问题是,在将该值添加到核心数据存储之前,我实际上需要在该点之前将该值标识为 …

null nsdata gamekit ios gkturnbasedmatch

7
推荐指数
1
解决办法
1万
查看次数

如何在OpenGL ES 2.0中相互独立地操作对象?

我正在使用OpenGL ES 2.0构建一个iOS游戏,其中包含一个包含大约100个不同"对象"的场景,我需要能够彼此独立地进行转换.我是OpenGL ES的新手.因此,我最初认为我应该从OpenGL ES 1.1开始,然后将应用程序迁移到2.0以利用增强的视觉效果.

然而,就像我对1.1感到满意一样,我意识到,部分基于Apple的以OpenGL为中心的Xcode模板,它可能会比直接进入2.0更加麻烦,所以我咬了一口子弹.

现在,我发现很难掌握足够的概念来对我的顶点数组对象进行简单的变换.我在OpenGLES 2.0文档中读到,最好的方法是使用多个VBO,每个顶点数组一个.但是,我似乎无法在不影响整个场景的情况下改变其中一个.

我使用Apple OpenGL ES模板启动了项目并简化了它,因此setupGL方法如下所示:

-(void)setupGL
{
    // Setup
    [EAGLContext setCurrentContext:self.context];        
    [self loadShaders];
    self.effect = [[GLKBaseEffect alloc] init];
    self.effect.light0.enabled = GL_TRUE;
    self.effect.light0.diffuseColor = GLKVector4Make(1.0f, 0.4f, 0.4f, 1.0f);
    glEnable(GL_DEPTH_TEST); // do depth comparisons and update the depth buffer

    // Initialize first buffer
    glGenVertexArraysOES(1, &_vertexArray);
    glBindVertexArrayOES(_vertexArray);    
    glGenBuffers(1, &_vertexBuffer);    
    glBindBuffer(GL_ARRAY_BUFFER, _vertexBuffer);    
    glBufferData(GL_ARRAY_BUFFER, sizeof(gPyramidVertexData), gPyramidVertexData, GL_DYNAMIC_DRAW);
    glEnableVertexAttribArray(GLKVertexAttribPosition);    
    glVertexAttribPointer(GLKVertexAttribPosition, 3, GL_FLOAT, GL_FALSE, 24, BUFFER_OFFSET(0));
    glEnableVertexAttribArray(GLKVertexAttribNormal);
    glVertexAttribPointer(GLKVertexAttribNormal, 3, GL_FLOAT, GL_FALSE, 24, BUFFER_OFFSET(12));    
    glBindVertexArrayOES(0);

    // Initialize second buffer
    glGenVertexArraysOES(2, &_vertexArray2); …
Run Code Online (Sandbox Code Playgroud)

opengl-es ios opengl-es-2.0

5
推荐指数
1
解决办法
2940
查看次数