Что я хочу сделать, так это провести пальцем по экрану (touchesMoved) и нарисовать равномерно расположенные изображения (возможно, CGImageRefs) вдоль точек, созданных touchesMoved. Я могу рисовать линии, но то, что я хочу сгенерировать, выглядит примерно так (в этом примере я использую изображение стрелки, но это может быть любое изображение, может быть изображение моей собаки :)) Главное, чтобы изображения располагались равномерно при рисовании пальцем на iPhone или iPad.
Нарисуйте изображения, равномерно расположенные вдоль пути в iOS
Ответы (2)
Предполагая, что у вас уже есть код, который отслеживает прикосновения пользователя, когда они перемещают свои прикосновения по экрану, похоже, вы хотите определить, когда они переместились на расстояние, равное длине вашего изображения, и в это время вы хотите нарисовать еще одну копию вашего изображения под их прикосновением.
Для этого, я думаю, вам потребуется:
- рассчитать длину (ширину) вашего изображения
- внедрить код для рисования копий вашего изображения на ваш вид, повернутых под любым углом
- each time the user's touch moves (e.g. in touchesMoved:):
- calculate the delta of the touch each time it moves and generate the "length" of that delta (e.g. something like sqrt(dx^2 + dy^2))
- накапливать расстояние с момента отрисовки последнего изображения
- если расстояние достигло длины вашего изображения, нарисуйте копию вашего изображения под текущим положением касания, повернув его соответствующим образом (возможно, в соответствии с вектором от положения последнего изображения до текущей позиции)
Как это звучит?
Прежде всего, ОГРОМНЫЙ реквизит достается Кендаллу. Итак, основываясь на его ответе, вот код, чтобы взять UIImage, нарисовать его на экране по пути (не настоящий pathRef, просто логический путь, созданный точками) на основе расстояния между касаниями, а затем повернуть изображение правильно на основе ВЕКТОРА текущей и предыдущей точек. Я надеюсь тебе понравится:
Сначала вам нужно снова и снова загружать изображение, которое будет использоваться в качестве CGImage:
NSString *imagePath = [[NSBundle mainBundle] pathForResource:@"arrow.png" ofType:nil];
UIImage *img = [UIImage imageWithContentsOfFile:imagePath];
image = CGImageRetain(img.CGImage);
убедитесь в вашем Dealloc, что вы звоните
CGImageRelease(image);
затем в touchesBegan просто сохраните начальную точку в переменной, которая находится за пределами метода (объявите ее в своем заголовке следующим образом:) в этом случае я рисую в UIView
@interface myView : UIView {
CGPoint lastPoint;
}
@end
потом в прикосновениях Началось:
-(void)touchesBegan:(NSSet *)touches withEvent:(UIEvent *)event
{
UITouch *touch = [touches anyObject];
lastPoint = [touch locationInView:self];
}
и, наконец, в touchesMoved нарисуйте растровое изображение на экране, а затем, когда ваше расстояние сместится на достаточное расстояние (в моем случае 73, так как мое изображение 73 x 73 пикселя), нарисуйте это изображение на экране, сохраните новое изображение и установите lastPoint равным в текущую точку
-(void)touchesMoved:(NSSet *)touches withEvent:(UIEvent *)event
{
UITouch *touch = [touches anyObject];
currentPoint = [touch locationInView:self];
double deltaX = lastPoint.x - currentPoint.x;
double deltaY = lastPoint.y - currentPoint.y;
double powX = pow(deltaX,2);
double powY = pow(deltaY,2);
double distance = sqrt(powX + powY);
if (distance >= 73){
lastPoint = currentPoint;
UIGraphicsBeginImageContext(self.frame.size);
[drawImage.image drawInRect:CGRectMake(0, 0, self.frame.size.width, self.frame.size.height)];
CGContextSaveGState(UIGraphicsGetCurrentContext());
float angle = atan2(deltaX, deltaY);
angle *= (M_PI / 180);
CGContextDrawImage(UIGraphicsGetCurrentContext(), CGRectMake(currentPoint.x, currentPoint.y, 73, 73),[self CGImageRotatedByAngle:image angle:angle * -1]);
CGContextRestoreGState(UIGraphicsGetCurrentContext());
drawImage.image = UIGraphicsGetImageFromCurrentImageContext();
UIGraphicsEndImageContext();
distance = 0;
}
}
- (CGImageRef)CGImageRotatedByAngle:(CGImageRef)imgRef angle:(CGFloat)angle
{
CGFloat angleInRadians = angle * (M_PI / 180);
CGFloat width = CGImageGetWidth(imgRef);
CGFloat height = CGImageGetHeight(imgRef);
CGRect imgRect = CGRectMake(0, 0, width, height);
CGAffineTransform transform = CGAffineTransformMakeRotation(angleInRadians);
CGRect rotatedRect = CGRectApplyAffineTransform(imgRect, transform);
CGColorSpaceRef colorSpace = CGColorSpaceCreateDeviceRGB();
CGContextRef bmContext = CGBitmapContextCreate(NULL,
rotatedRect.size.width,
rotatedRect.size.height,
8,
0,
colorSpace,
kCGImageAlphaPremultipliedFirst);
CGContextSetAllowsAntialiasing(bmContext, FALSE);
CGContextSetInterpolationQuality(bmContext, kCGInterpolationNone);
CGColorSpaceRelease(colorSpace);
CGContextTranslateCTM(bmContext,
+(rotatedRect.size.width/2),
+(rotatedRect.size.height/2));
CGContextRotateCTM(bmContext, angleInRadians);
CGContextTranslateCTM(bmContext,
-(rotatedRect.size.width/2),
-(rotatedRect.size.height/2));
CGContextDrawImage(bmContext, CGRectMake(0, 0,
rotatedRect.size.width,
rotatedRect.size.height),
imgRef);
CGImageRef rotatedImage = CGBitmapContextCreateImage(bmContext);
CFRelease(bmContext);
[(id)rotatedImage autorelease];
return rotatedImage;
}
это создаст изображение, которое выглядит следующим образом:
Собираюсь добавить следующее (с некоторыми изменениями в приведенном выше коде, чтобы попытаться заполнить пустоты, где touchesMoved пропускает некоторые точки при быстром перемещении:
CGPoint point1 = CGPointMake(100, 200);
CGPoint point2 = CGPointMake(300, 100);
double deltaX = point2.x - point1.x;
double deltaY = point2.y - point1.y;
double powX = pow(deltaX,2);
double powY = pow(deltaY,2);
double distance = sqrt(powX + powY);
distance = 0;
for (int j = 1; j * 73 < distance; j++ )
{
double x = (point1.x + ((deltaX / distance) * 73 * j));
double y = (point1.y + ((deltaY / distance) * 73 * j));
NSLog(@"My new point is x: %f y :%f", x, y);
}