gpt4 book ai didi

panning - C4:给 "self"以外的对象添加平移

转载 作者:行者123 更新时间:2023-12-01 15:54:22 25 4
gpt4 key购买 nike

我观看了 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];
}

最佳答案

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

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

为此我:

  1. 子类 C4Shape
  2. 向新类添加自定义行为
  3. 在 Canvas 上创建子类对象

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

子类化

你必须创建一个子类来给自己一些行为。由于您使用的是形状,所以我也这样做了。我称我的子类为 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 的调用方式与它对 Canvas 的调用方式相同...因此,这是我为该对象添加手势的地方。安装程序在调用 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 对象并将它添加到屏幕上。此方法通过调用其 new 方法创建一个 Character 对象(我必须这样做,因为它是 C4Shape 的子类),转将它变成一个带有我给它的框架的椭圆,设置它的 startOrigin,改变它的 animationDuration

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

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

注意:因为我使用 startOrigin 属性创建了我的子类,所以我能够在该类中始终动画化到那个点。我还可以随时在 Canvas 上设置该点。

关于panning - C4:给 "self"以外的对象添加平移,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/19232921/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com