我有一年的Objective-C作品,这是我的第一个问题,因为我总是在这个网站找到答案,但这种情况完全是疯了,并没有发现任何类似的东西。
我有一个自定义类(来自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显示完美,动画效果很好,但是在重新加载ViewController之后,UITapGesture就像早期提到的一样。
这是Ball和UIView(@kBall)成像的链接。对不起,关于图像,但我不能加载,直到我得到10分:(
答案 0 :(得分:0)
这可能是superview框架的问题。持有ballView00的视图是什么? ballView是否完全位于超视图的范围内?
通常当你遇到问题时,你会期待触摸,但却没有得到它,因为设置为接触触摸的视图超出了其父母的界限。
因此,如果超视图边界为100x100且球在x = 125 y = 125时,则不会接触到。
当您的视图布局时会发生很多魔法,因为某些不正确的约束,有时会找到一个具有0x0维度的魔法并不奇怪。
您可以通过为其提供背景颜色来轻松检查所有视图的边界。
答案 1 :(得分: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,所以当我更改屏幕并返回时,旋转停止,这有助于发现这种情况。 < / p>
感谢您的帮助。