我有一个应用程序,让用户跟踪屏幕上的行.我是通过在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应用程序,其中A类是UIViewController的子类:

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

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

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

从我正在阅读的内容来看,处理这个问题的最好方法是使用构图,但我不明白如何最好地将它应用到我的情况中.
作为一个替代解决方案,我意识到我可以创建一个包装器类D,然后我可以逐个app地修改它从适当的超类继承用于手头的任务:


但这看起来有点像hacky.有一个更好的方法吗?
我正在处理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.
所以才出现,在某些时候,核心数据是"清洗"的属性,其波普尔零值.我的问题是,在将该值添加到核心数据存储之前,我实际上需要在该点之前将该值标识为 …
我正在使用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) ios ×4
gamekit ×1
inheritance ×1
iphone ×1
nsdata ×1
null ×1
objective-c ×1
opengl-es ×1
pan ×1