【问题标题】:PAN gesture ending not triggering 'touches ended' with a C4View Subclass? (C4)PAN 手势结束没有触发 C4View 子类的“触摸结束”? (C4)
【发布时间】:2012-12-14 16:26:20
【问题描述】:

所以我正在使用C4 IOS 编码框架,我遇到了一些我无法弄清楚的事情。

我将两个示例一起用于 C4 github 帐户 - testScrollView 和 WalkCycle 示例。

我有一个名为 Walker 的 C4View 子类,它使用 WalkCycle 示例作为小动画角色的模板。这个字符被放置在从 testScrollView 示例创建的可滚动视图中。他添加了一个平移手势,以便用户可以将他拖到屏幕顶部,然后看着他跌倒并摔倒在底部。

唯一的问题是,当平移手势结束时,我无法调用任何类型的方法,不是来自 -(void)touchesEnded 命令,也不是来自我尝试过的其他命令。

一些类似问题的链接对我没有帮助,但可能会帮助其他人解决这个问题:

我完全没有受过教育和毫无根据的预感是它与步行者是 C4View 的孩子有关,因为我在识别 touchesEnded 与 c4shapes 和图像时没有这个问题。

我不太确定要发布什么代码,但这里是 Walker.m 中的相关部分;

-(void)setup {
walkA = [C4Image animatedImageWithNames:@[@"beaviswalk1.tiff",
         @"beaviswalk2.tiff",
         @"beaviswalk3.tiff",
         @"beaviswalk4.tiff",
         @"beaviswalk5.tiff",
         @"beaviswalk6.tiff",
         @"beaviswalk7.tiff",
         @"beaviswalk8.tiff",
         @"beaviswalk9.tiff",
         ]];
[self addImage:walkA];
currentImage = walkA;
[walkA play];

mover = [C4Timer automaticTimerWithInterval:0.05f target:self method:@"walking" repeats:YES];


[self addGesture:TAP name:@"tapGesture" action:@"trip"];
[self addGesture:PAN name:@"panGesture" action:@"move:"];}

并且touchesEnded:

-(void)touchesEnded {
C4Log(@"touches Ended");
}

看着 Walker.h,我突然意识到一些奇怪的事情;

#import "C4View.h"

@interface Walker : C4Image
-(id)initWithFrame:(CGRect)frame;
-(void)play;
-(void)switchWalkCycle;
-(void)trip;
-(void)bleed;
-(void)walking;
-(void)touchesEnded;
-(void)noTouching;
@end

我在某个时候将@interface 更改为 C4Image,当时它似乎没有任何效果,让我可以使用 TAP 和 PAN 手势。直到现在......将它改回 C4View 将消除对所有手势的支持。我想问题出在哪里?

如果有一个简单的解决方案,我深表歉意,但我在尝试解决这个问题时很迷茫。

【问题讨论】:

  • 这里发生了两件不同的事情。首先,C4View 对象没有完全实现,因此 C4Control 对象的手势识别功能还没有工作。第二,……我不确定。我会尽快看看这两个问题。

标签: ios c4


【解决方案1】:

您添加到 Walker 的 PAN 手势中的 move: 方法实际上引用了 C4Control 类(即所有可视对象)中内置的方法。

要确定手势何时释放,您可以重写该方法以添加检查手势状态何时结束的条件。

为此,您首先要对 C4 对象进行子类化(这里我使用的是 C4Shape,但您可以使用 C4Image)。

标题将如下所示:

#import "C4Shape.h"
@interface MyShape : C4Shape
@end

实现将有一个被覆盖的move: 方法,如下所示:

#import "MyShape.h"
@implementation MyShape

-(void)move:(id)sender {
    [super move:sender];
    UIPanGestureRecognizer *panGesture = (UIPanGestureRecognizer *)sender;
    if(panGesture.state == UIGestureRecognizerStateEnded) {
        [self methodToRunWhenPanGestureEnds];
    }
}

-(void)methodToRunWhenPanGestureEnds {
    C4Log(@"the pan gesture ended");
}

@end

...最后,在您的工作区中,您可以像往常一样创建对象并为其添加手势。

#import "C4WorkSpace.h"
#import "MyShape.h"
@implementation C4WorkSpace
-(void)setup {
    MyShape *s = [[MyShape alloc] initWithFrame:CGRectMake(0, 0, 100, 100)];
    [s rect:s.frame];
    [s addGesture:PAN name:@"pan" action:@"move:"];
    [self.canvas addShape:s];
}
@end

您可以从此处获取一个 C4 项目的副本,该项目展示了如何执行此操作:https://github.com/C4Code/PanGestureEnded


至于您遇到的 C4View 问题,您是对的……目前您不会在 C4Views 上使用手势。您可以将常规 UIGestureRecognizers 添加到 C4Views,但 [object addGesture:name:action:] 方法将不起作用,因为我们尚未为 C4View 类实现此功能(但它已经在我们的待办事项列表中)。

【讨论】:

  • 太棒了特拉维斯。明天我会试试这个。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2012-10-26
相关资源
最近更新 更多