您正在使用的示例链接是偷偷摸摸的。因为我知道画布上只会有一个对象,所以我知道我可以让它看起来像是在平移标签。正如您已经发现的那样,这不适用于多个对象。
要让不同的对象独立移动并识别它们何时被拖动,您需要对对象进行子类化并赋予它们自己的“能力”。
为此,我:
- 子类
C4Shape
- 将自定义行为添加到新类
- 在画布上创建子类对象
每个步骤的代码如下所示:
子类化
你必须创建一个子类来给自己一些行为。由于您正在处理形状,因此我也这样做了。我调用我的子类Character
,它的文件如下所示:
字符.h
#import "C4Shape.h"
@interface Character : C4Shape
@property (readwrite, atomic) CGPoint startOrigin;
@end
我已经为形状添加了一个属性,以便我可以设置它的起始原点(即它将返回的点)。
字符.m
#import "Character.h"
@implementation Character
-(void)setup {
[self addGesture:PAN name:@"pan" action:@"move:"];
}
-(void)move:(UIGestureRecognizer *)sender {
if(sender.state == UIGestureRecognizerStateEnded) {
self.center = self.startOrigin;
} else {
[super move:sender];
}
}
@end
在 C4 对象的子类中,setup
以与画布相同的方式调用......所以,这是我为这个对象添加手势的地方。安装程序在new
或alloc
/init
被调用后运行。
该move:
方法是我想用自定义行为覆盖的地方。在这种方法中,我捕获了手势识别器,如果它的状态是,UIGestureRecognizerStateEnded
那么我想动画回到起始点。否则,我希望它move:
喜欢它,所以我只需调用[super move:sender]
哪个运行默认move:
方法。
这就是子类。
创建子类对象
然后我的工作区如下所示:
#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
对象并将其添加到屏幕上。Character
这个方法通过调用它的方法来创建一个对象new
(我必须这样做,因为它是 的子类C4Shape
),用我给它的框架把它变成一个椭圆,设置它startOrigin
,改变它的animationDuration
.
工作区的其余部分是这样的(注意:上面的代码中标记了这些步骤):
- 我
#import
是子类,以便我可以用它创建对象
- 我创建了 3 个对 Character 对象的引用。
- 我创建了一个框架,用于构建每个新对象
- 对于每个对象,我
frame
通过更改其原点来重新定位,然后使用createCharacter:
我编写的方法使用它来创建一个新对象。
- 我将所有新对象添加到
canvas
.
注意:因为我使用startOrigin
属性创建了我的子类,所以我能够在该类中始终以动画方式返回到该点。我也可以随时在画布上设置该点。