gpt4 book ai didi

ios - 如何获取动画 UIImageView 的坐标

转载 作者:行者123 更新时间:2023-11-29 04:06:06 27 4
gpt4 key购买 nike

所以,我有一个带有动画 UIImage 的 UIImageView。 UIImageView 本身使用 CAKeyframeAnimation 和 CGMutablePathRef 进行动画处理,以在路径中提供一些随机性。我的问题是我需要跟踪何时有人点击动画 UIIMageView。

我已经在这方面苦苦挣扎了一段时间了,看来我应该将 UITouch 与 UIImage 表示层在屏幕上的位置进行比较,但我不知道如何获得它的坐标。

所以主要问题是,如何获取在屏幕上动画的 UIIMageView 的坐标并将其与点击发生的位置进行比较?

如果我现在按原样运行代码,它将引发错误:

-[CALayer center]:无法识别的选择器发送到实例 0xa105150

它不再崩溃,但我仍然不知道如何确定 UIImageView 在屏幕上移动时的位置。

我的相关代码如下。任何帮助将不胜感激。

- (void)animateCarrierFish
{
NSInteger getWhichFish = (arc4random()%[self.fishes count]);
NSArray *selectedFish = [NSArray arrayWithArray:[self.fishes objectAtIndex:getWhichFish]];
UIImage *fishName = [selectedFish objectAtIndex:0];

UIImageView *fishCarrier = [[UIImageView alloc] initWithImage:fishName];
fishCarrier.animationImages = selectedFish;
fishCarrier.animationDuration = 1.5;
fishCarrier.animationRepeatCount = 0;
fishCarrier.frame = CGRectMake(0, 0, fishName.size.width*screenScale, fishName.size.height*screenScale);

NSInteger startPoint;
NSInteger endPoint;
NSInteger oppositeMod;

NSInteger fromWhichDirection = (arc4random()%2);
if(fromWhichDirection==1)
{
startPoint = rightEdge;
endPoint = leftEdge;
oppositeMod = -rightEdge;
fishCarrier.transform = CGAffineTransformMakeScale(-1, 1);
} else {
startPoint = leftEdge;
endPoint = rightEdge;
oppositeMod = 0;
}

NSInteger aniSpeed = [self getRandomNumberBetweenMin:15 andMax:20];

CAKeyframeAnimation *pathAnimation = [CAKeyframeAnimation animationWithKeyPath:@"position"];
pathAnimation.duration = aniSpeed;
pathAnimation.calculationMode = kCAAnimationCubic;
pathAnimation.fillMode = kCAFillModeForwards;
pathAnimation.removedOnCompletion = NO;

CGMutablePathRef pointPath = CGPathCreateMutable();

NSInteger yPoint = [self getRandomNumberBetweenMin:waterLine andMax:seaFloor];
CGPathMoveToPoint(pointPath, NULL, startPoint, yPoint);

NSInteger howManyDips = [self getRandomNumberBetweenMin:2 andMax:4];

int i=0;
for (i = 0; i < howManyDips; i++)
{
yPoint = [self getRandomNumberBetweenMin:waterLine andMax:seaFloor];
NSInteger xMod = [self getRandomNumberBetweenMin:-25 andMax:25];

NSInteger xPoint = (([[UIScreen mainScreen] bounds].size.height/(howManyDips+1))*(i+1)) + xMod + oppositeMod;
if (xPoint <0)
{
xPoint = xPoint*-1;
}
CGPathAddLineToPoint(pointPath, NULL, xPoint, yPoint);
}

yPoint = [self getRandomNumberBetweenMin:waterLine andMax:seaFloor];
CGPathAddLineToPoint(pointPath, NULL, endPoint, yPoint);
pathAnimation.path = pointPath;
CGPathRelease(pointPath);


[fishCarrier.layer addAnimation:pathAnimation forKey:@"pathAnimation"];
[self.view addSubview:fishCarrier];
[fishCarrier startAnimating];

fishCarrier.userInteractionEnabled = YES; // these two lines don't seem to do anything
fishCarrier.multipleTouchEnabled = YES;
fishCarrier.tag=[self.swimmers count];

[self.swimmers addObject:fishCarrier];
}

- (void) touchesBegan:(NSSet *)touches withEvent:(UIEvent *)event
{
[super touchesBegan:touches withEvent:event];

UITouch *touch = [touches anyObject];
CGPoint touch_point = [touch locationInView:self.view];


for (UIImageView *image in self.swimmers) {
// HOW do I get the coordinates in the main view of this sublayer?
}
}

最佳答案

通过对 TouchBegan 方法进行以下更改,我最终能够让对象报告它们在屏幕上的位置:

- (void) touchesBegan:(NSSet *)touches withEvent:(UIEvent *)event
{
[super touchesBegan:touches withEvent:event];

UITouch *touch = [touches anyObject];
CGPoint startPoint = [touch locationInView:self.view];
CGFloat x = startPoint.x;
CGFloat y = startPoint.y;

//create touch point
CGPoint touchPoint = CGPointMake(x, y);

// loop through the items we're iterested in being tapped on here
for (UIImageView *fish in self.swimmers) {
CGRect fishFrame = [[fish.layer presentationLayer] frame];

if (CGRectContainsPoint(fishFrame, touchPoint)) {
NSLog(@"You hit fish: %u",fish.tag); // do stuff here
}
}
}

关于ios - 如何获取动画 UIImageView 的坐标,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/15209342/

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