我观看了C4教程,向对象添加了一个平移手势,并在平移完成时将其设置为动画以返回其原始位置。我正在尝试将其添加到三个单独的对象中。到目前为止,我已经使用了一个对象来移动它并将其重置为CGPoint,但为了使其工作,我必须将平移手势添加到“自身”,而不是对象。作为参考,我几乎使用了这里的代码:
http://www.c4ios.com/tutorials/interactionPanning
如果我将手势添加到对象本身,当然,它会平移,但它会将自己留在最后一个触摸位置。但是,我假设将手势放在“自我”上不仅会影响我想要移动的对象,而且我希望能够单独移动这三个对象。
我使用与示例中使用的“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];
}
答案 0 :(得分:1)
您正在使用的示例链接是偷偷摸摸的。因为我知道画布上只有一个物体,所以我知道我可以让它看起来像是在淘汰标签。这对于多个对象不起作用,正如您已经想到的那样。
要让不同的对象独立移动,并识别拖动它们的时间,您需要子类化对象并为它们提供自己的“能力”。
要做到这一点我:
C4Shape
每个步骤的代码如下所示:
你必须创建一个给自己一些行为的子类。既然你正在使用形状,我也是这样做的。我调用我的子类Character
,其文件如下所示:
Character.h
#import "C4Shape.h"
@interface Character : C4Shape
@property (readwrite, atomic) CGPoint startOrigin;
@end
我在形状中添加了一个属性,以便我可以设置它的起始原点(即它将返回的点)。
Character.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
子类,以便我可以用它创建对象frame
,然后使用它来创建一个使用我编写的createCharacter:
方法的新对象。canvas
。注意:因为我使用startOrigin
属性创建了我的子类,所以我可以在该类中始终将动画回到该点。我也可以随时在画布上设置这一点。