Panning C4:将平移添加到除“平移”以外的对象;“自我”;
我观看了C4教程,内容是向对象添加平移手势,并在平移完成后设置动画使其返回原始位置。我试图将其添加到三个单独的对象中。到目前为止,我让它使用一个对象来移动它并将其重置为一个CG点,但是为了使它工作,我必须将平移手势添加到“自我”,而不是对象。作为参考,我基本上使用了以下代码: 如果我将手势添加到对象本身,当然,它会四处平移,但它只会在最后一次触摸的位置离开自己。然而,我假设,将手势保留在“self”上不仅会影响我想要移动的对象,而且我希望能够单独移动这三个对象Panning C4:将平移添加到除“平移”以外的对象;“自我”;,panning,c4,Panning,C4,我观看了C4教程,内容是向对象添加平移手势,并在平移完成后设置动画使其返回原始位置。我试图将其添加到三个单独的对象中。到目前为止,我让它使用一个对象来移动它并将其重置为一个CG点,但是为了使它工作,我必须将平移手势添加到“自我”,而不是对象。作为参考,我基本上使用了以下代码: 如果我将手势添加到对象本身,当然,它会四处平移,但它只会在最后一次触摸的位置离开自己。然而,我假设,将手势保留在“self”上不仅会影响我想要移动的对象,而且我希望能够单独移动这三个对象 我对示例中使用的“move”方
我对示例中使用的“move”方法进行了大致相同的修改:
-(void)move:(UIPanGestureRecognizer *)recognizer {
[character move:recognizer];
if (recognizer.state == UIGestureRecognizerStateEnded) {
[character setCenter: charStartOrigin];
}
}
然后是生成对象的新方法:
-(void)createCharacters {
character = [C4Shape ellipse:charStart];
[character addGesture:PAN name:@"pan" action:@"move:"];
[self.canvas addShape:character];
}
您正在使用的示例链接是偷偷的。因为我知道画布上只有一个物体,所以我知道我可以让它看起来像是在平移标签。正如您已经了解的那样,这对多个对象不起作用 要使不同的对象独立移动,并识别它们何时被拖动,您需要对对象进行子类化,并赋予它们自己的“能力” 为此,我:
C4Shape
#import "C4WorkSpace.h"
//1
#import "Character.h"
@implementation C4WorkSpace {
//2
Character *charA, *charB, *charC;
}
-(void)setup {
//3
CGRect frame = CGRectMake(0, 0, 100, 100);
//4
frame.origin = CGPointMake(self.canvas.width / 4 - 50, self.canvas.center.y - 50);
charA = [self createCharacter:frame];
frame.origin.x += self.canvas.width / 4.0f;
charB = [self createCharacter:frame];
frame.origin.x += self.canvas.width / 4.0f;
charC = [self createCharacter:frame];
//5
[self.canvas addObjects:@[charA,charB,charC]];
}
-(Character *)createCharacter:(CGRect)frame {
Character *c = [Character new];
[c ellipse:frame];
c.startOrigin = c.center;
c.animationDuration = 0.25f;
return c;
}
@end
子类化
您必须创建一个子类,为自己提供一些行为。既然你在处理形状,我也这样做了。我调用我的子类Character
,其文件如下所示:
字符.h
我已向形状添加了一个属性,以便可以设置其起始原点(即它将返回的点)
性格
在C4对象的子类中,setup
以与画布相同的方式被调用。。。这就是我为这个物体添加手势的地方。调用new
或alloc
/init
后运行安装程序
move:
方法是我想用自定义行为覆盖的地方。在这个方法中,我捕捉手势识别器,如果它的状态是uigestureRecognitzerStateEnded
,那么我希望动画回到起始原点。否则,我希望它像应该的那样移动:
,因此我只需调用运行默认移动:
方法的[super move:sender]
子类就是这样
创建子类对象
我的工作区如下所示:
#import "C4WorkSpace.h"
//1
#import "Character.h"
@implementation C4WorkSpace {
//2
Character *charA, *charB, *charC;
}
-(void)setup {
//3
CGRect frame = CGRectMake(0, 0, 100, 100);
//4
frame.origin = CGPointMake(self.canvas.width / 4 - 50, self.canvas.center.y - 50);
charA = [self createCharacter:frame];
frame.origin.x += self.canvas.width / 4.0f;
charB = [self createCharacter:frame];
frame.origin.x += self.canvas.width / 4.0f;
charC = [self createCharacter:frame];
//5
[self.canvas addObjects:@[charA,charB,charC]];
}
-(Character *)createCharacter:(CGRect)frame {
Character *c = [Character new];
[c ellipse:frame];
c.startOrigin = c.center;
c.animationDuration = 0.25f;
return c;
}
@end
我已经在我的工作区中添加了一个方法,该方法创建了一个字符
对象并将其添加到屏幕上。此方法通过调用其新方法创建角色
对象(我必须这样做,因为它是C4Shape
的子类),使用我给它的帧将它变成椭圆,设置它的startOrigin
,更改它的动画持续时间
工作区其余部分的情况如下(注意:上述代码中标记了这些步骤):
我导入子类,这样我就可以用它创建对象了
我创建了3个对角色对象的引用
我将创建一个框架,用于构建每个新对象
对于每个对象,我通过更改其原点重新定位frame
,然后使用我编写的createCharacter:
方法创建一个新对象
我将所有新对象添加到画布
注意:因为我用一个startOrigin
属性创建了我的子类,所以我能够在该类中始终将动画设置回该点。我还可以随时从画布上设置该点。如果你能发布你正在使用的代码,那么我可以更直接地提供帮助。我对示例中使用的“move”方法进行了大致相同的修改:-(void)move:(uipangestureerecognizer*)recognizer{[character move:recognizer];If(recognizer.state==UIgestureRecognitizerStateEnded){[character setCenter:charStartOrigin];}}}然后是生成对象的新方法:-(void)createCharacters{character=[C4Shape ellipse:charStart];[character add手势:平移名称:@“平移”操作:@“移动:”;[self.canvas addShape:character];}注意,我是如何将手势添加到子类中的self
的?在本例中,它表示字符
对象,而不是画布。C4(和ObjC)中的所有子类可以将自己称为self
。谢谢,这很好用!不过仅供将来参考,因为我来自Java背景-底部的方法本质上是类的“构造函数”,是吗?当您从C4Shape(C4Object)继承时与NSObject相比,“构造函数”实现是否需要写入工作区而不是.m文件中?再次感谢!在C4/ObjC中,构造函数是以单词init
开头的方法。基本的init方法是:-(id)init{…}
,因此创建字符的方法在技术上不是构造函数。[character new]
方法只是包装[[character alloc]init];
…这“本质上”是字符
类的构造函数。
#import "C4WorkSpace.h"
//1
#import "Character.h"
@implementation C4WorkSpace {
//2
Character *charA, *charB, *charC;
}
-(void)setup {
//3
CGRect frame = CGRectMake(0, 0, 100, 100);
//4
frame.origin = CGPointMake(self.canvas.width / 4 - 50, self.canvas.center.y - 50);
charA = [self createCharacter:frame];
frame.origin.x += self.canvas.width / 4.0f;
charB = [self createCharacter:frame];
frame.origin.x += self.canvas.width / 4.0f;
charC = [self createCharacter:frame];
//5
[self.canvas addObjects:@[charA,charB,charC]];
}
-(Character *)createCharacter:(CGRect)frame {
Character *c = [Character new];
[c ellipse:frame];
c.startOrigin = c.center;
c.animationDuration = 0.25f;
return c;
}
@end