0

我在 Objective-C 上工作了 1 年,这是我提出的第一个问题,因为我总是在这个网站上找到答案,但这种情况完全是疯狂的,没有发现任何类似的东西。

我有一个自定义类(从 UIView 称为 BallClass)。UIView 内部有一个 UIImageView 和一个用于执行操作的 UITapGesture。

因此,当我在 UIViewController 中创建对象时,在按下对象时不工作 tapAction,但如果我切换到其他屏幕并返回它,则 tapGesture 工作完美。

我尝试了很多选择,但我无法在第一次加载时完成工作。

我使用 ARC、Xcode (4.6.3) 和 OSX (10.8.4) 和 IB,但是这个对象是在没有 IB 的情况下创建的。

提前致谢。

这是类 BallClass.m

    - (void)tapGesture:(UIGestureRecognizer *)tapGesture {
            NSLog(@"hola");
    }

    - (id)initBall:(CGRect)frame {
           if (self = [super initWithFrame:frame]) {
           // Initialization code

           // Recibir las variables iniciales para el control del timer
           ball = [[Ball alloc] init];

           // Agregar la imagen de la pelota en el view
          UIImageView *imageView = [[UIImageView alloc] initWithFrame:CGRectMake(self.frame.origin.x, self.frame.origin.y, self.frame.size.width, self.frame.size.height)];
          [imageView setCenter:CGPointMake(CGRectGetMidX([self bounds]), CGRectGetMidY([self bounds]))];
          [imageView setContentMode:UIViewContentModeScaleAspectFit];
          [imageView setImage:[UIImage imageNamed:@"pelota.png"]];
          [imageView setTag:100];
          [imageView setNeedsDisplay];

         // Add TAP
          UITapGestureRecognizer *tapGesture = [[UITapGestureRecognizer alloc] initWithTarget:self action:@selector(tapGesture:)];
         // Tap Properties
        [tapGesture setDelaysTouchesBegan:YES];
        [tapGesture setNumberOfTapsRequired:1];
        [tapGesture setDelegate:(id)self];
        [imageView addGestureRecognizer:tapGesture];

        [self addSubview:imageView];

        [self setNeedsDisplay];

         // Propiedades del View
       [self setUserInteractionEnabled:YES];
       self.backgroundColor = [UIColor clearColor];
        [self setTag:100];

       // BALL BOUNCE
       [NSTimer scheduledTimerWithTimeInterval:1.0 / 30.0 target:self selector:@selector(onTimer:) userInfo:nil repeats:YES];        
      }

      return self;
      }

    - (void)onTimer:(NSTimer *)timerLocal {
        // Do something
     }

    ... // more methods    

这是实例化:

       ballView00 = [[BallView alloc] initBall:CGRectMake(10, 10, 40, 40)];

UiView 显示完美,动画效果很好,但 UITapGesture 只是工作,如前所述,重新加载 ViewController 后。

这是 Ball 和 UIView (@kBall) 的图像链接。抱歉,关于图像,但我在获得 10 分之前无法加载 :(

4

2 回答 2

0

我找到了解决方案。

球用这个旋转:

    [UIView animateWithDuration: 0.5f
                      delay: 0.0f
                    options: UIViewAnimationOptionCurveEaseIn
                 animations: ^{
                     self.transform = CGAffineTransformRotate(self.transform, M_PI / 2);
                 }
                 completion: ^(BOOL finished) {
                     if (finished) {
                         if (animating) {
                             // if flag still set, keep spinning with constant speed
                             [self spinWithOptions: UIViewAnimationOptionCurveLinear];
                         }
                    }
                 }];

并与主定时器产生冲突。我用简单的 add self.transform = CGAffineTransformRotate(self.transform, M_PI / 2); 改变旋转动作 在类的drawRect方法里面。

显然,我不能嵌套两个计时器,因为“禁用”了 tapGesture,所以当我改变屏幕并返回时,旋转停止了,这有助于找到这种情况。

谢谢你的帮助。

于 2013-07-12T16:58:59.023 回答
0

这可能是超级视图框架的问题。什么视图持有ballView00?ballView 是否完全在它的超级视图范围内?

通常,当您遇到期望触摸但没有得到触摸的问题时,这是因为设置为接收触摸的视图超出了其父项的范围之一。

因此,如果超级视图边界是 100x100 并且球在 x=125 y=125 处,它将不会收到触摸。

当你的视图被布局时会发生很多神奇的事情,有时会因为一些不正确的约束而找到一个尺寸为 0x0 的视图并不奇怪。

您可以通过给它们一个背景颜色来轻松检查所有视图的边界。

于 2013-07-12T04:53:54.800 回答