3

我观看了 C4 教程,介绍了向对象添加平移手势并在平移完成后对其进行动画处理以返回其原始位置。我正在尝试将其添加到三个单独的对象中。到目前为止,我让它与一个对象一起工作以将其移动并将其重置为 CGPoint,但要使其正常工作,我必须将平移手势添加到“self”,而不是对象。作为参考,我几乎使用了这里的代码:

http://www.c4ios.com/tutorials/interactionPanning

如果我将手势添加到对象本身,当然,它会平移,但它只会将自己留在最后一个触摸位置。但是,我假设将手势留在“self”上不仅会影响我想要移动的对象,而且我希望能够单独移动三个对象。


我对示例中使用的“移动”方法使用了大致相同的修改:

-(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]; 
}
4

1 回答 1

1

您正在使用的示例链接是偷偷摸摸的。因为我知道画布上只会有一个对象,所以我知道我可以让它看起来像是在平移标签。正如您已经发现的那样,这不适用于多个对象。

要让不同的对象独立移动并识别它们何时被拖动,您需要对对象进行子类化并赋予它们自己的“能力”。

为此,我:

  1. 子类C4Shape
  2. 将自定义行为添加到新类
  3. 在画布上创建子类对象

每个步骤的代码如下所示:

子类化

你必须创建一个子类来给自己一些行为。由于您正在处理形状,因此我也这样做了。我调用我的子类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以与画布相同的方式调用......所以,这是我为这个对象添加手势的地方。安装程序在newalloc/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.

工作区的其余部分是这样的(注意:上面的代码中标记了这些步骤):

  1. #import是子类,以便我可以用它创建对象
  2. 我创建了 3 个对 Character 对象的引用。
  3. 我创建了一个框架,用于构建每个新对象
  4. 对于每个对象,我frame通过更改其原点来重新定位,然后使用createCharacter:我编写的方法使用它来创建一个新对象。
  5. 我将所有新对象添加到canvas.

注意:因为我使用startOrigin属性创建了我的子类,所以我能够在该类中始终以动画方式返回到该点。我也可以随时在画布上设置该点。

于 2013-10-07T22:49:07.890 回答