【发布时间】:2014-02-05 13:03:37
【问题描述】:
我想在用户触摸位置的视图中添加一个UIImageView,并在用户按住手指时让UIImageView 增长。想象一个气球被炸毁。我希望 UIImageView 的中心在其增长时保持在用户的触摸位置。
我认为最好的方法是UILongPressGestureRecognizer,并在下面写了。这确实像我计划的那样工作,除了视觉效果有些波涛汹涌和笨拙。
在UILongPressGestureRecognizer 调用UIGestureRecognizerStateEnded 之前,有什么方法可以为UIImageView 的大小设置动画?
或者,有没有更好的方法来做到这一点?
在 .h 中声明: CGPoint longPressLocation;
.m:
- (IBAction) handleInflation:(UILongPressGestureRecognizer *) inflateGesture {
longPressLocation= [inflateGesture locationInView:self.view];
switch (inflateGesture.state) {
case UIGestureRecognizerStateBegan:{
NSLog(@"Long press Began .................");
inflateTimer = [NSTimer scheduledTimerWithTimeInterval:.4 target:self selector:@selector(inflate) userInfo:nil repeats:YES];
UIImage *tempImage=[UIImage imageNamed:@"bomb.png"];
UIImageView *inflatableImageView = [[UIImageView alloc] initWithFrame:CGRectMake(longPressLocation.x-tempImage.size.width/2,
longPressLocation.y-tempImage.size.height/2,
tempImage.size.width, tempImage.size.height)];
inflatableImageView.image = tempImage;
[bonusGame addSubview:inflatableImageView];
inflatable=inflatableImageView;
}
break;
case UIGestureRecognizerStateChanged:{
NSLog(@"Long press Changed .................");
}
break;
case UIGestureRecognizerStateEnded:{
NSLog(@"Long press Ended .................");
[inflateTimer invalidate];
}
break;
default:
break;
}
}
-(void)inflate{
inflatable.frame=CGRectMake(inflatable.frame.origin.x,inflatable.frame.origin.y , inflatable.bounds.size.width+15, inflatable.bounds.size.height+15);
inflatable.center=longPressLocation;
}
最终工作代码:
- (IBAction) handleInflation:(UILongPressGestureRecognizer *) inflateGesture {
inflateGesture.minimumPressDuration = .01;
longPressLocation= [inflateGesture locationInView:self.view];
switch (inflateGesture.state) {
case UIGestureRecognizerStateBegan:{
NSLog(@"Long press Began .................");
inflateStart = [NSDate date];
inflateDisplayLink = [NSClassFromString(@"CADisplayLink") displayLinkWithTarget:self selector:@selector(inflate)];
[inflateDisplayLink setFrameInterval:1];
[inflateDisplayLink addToRunLoop:[NSRunLoop currentRunLoop] forMode:NSDefaultRunLoopMode];
UIImage *tempImage=[UIImage imageNamed:@"bomb.png"];
UIImageView *inflatableImageView = [[UIImageView alloc] initWithFrame:CGRectMake(longPressLocation.x-tempImage.size.width/2,
longPressLocation.y-tempImage.size.height/2,
tempImage.size.width, tempImage.size.height)];
inflatableImageView.image = tempImage;
[bonusGame addSubview:inflatableImageView];
inflatable=inflatableImageView;
}
break;
case UIGestureRecognizerStateChanged:{
NSLog(@"Long press Changed .................");
}
break;
case UIGestureRecognizerStateEnded:{
NSLog(@"Long press Ended .................");
[inflateDisplayLink invalidate];
}
break;
default:
break;
}
}
-(void)inflate{
NSDate *inflateEnd = [NSDate date];
NSTimeInterval inflateInterval;
inflateInterval = ([inflateEnd timeIntervalSince1970] - [inflateStart timeIntervalSince1970])*25;
inflatable.frame=CGRectMake(inflatable.frame.origin.x,
inflatable.frame.origin.y ,
inflatable.bounds.size.width+inflateInterval,
inflatable.bounds.size.height+inflateInterval);
inflatable.center=longPressLocation;
if(inflatable.bounds.size.width>200){
[inflateDisplayLink invalidate];
}
}
【问题讨论】:
-
效率如何?这是一个整洁的小解决方案!
-
@homelesspeoplecancode 它非常适合我的需求(我女儿的一个简单的气球爆破游戏),她能够在屏幕上创建大约 1000 个气球而没有任何问题。虽然现在在 Swift 中可能有更好的方法来做到这一点:)
标签: ios iphone objective-c uiimageview uiviewanimation