iphone: как повернуть прямоугольное изображение с помощью сенсорных событий? - PullRequest
0 голосов
/ 07 сентября 2011

преобразовать квадратное или круглое изображение легко ...

Но что, если прямоугольное изображение ???

Это изображение, которое я хочу преобразовать с помощью сенсорного события.

enter image description here

Центром круга является (30, 236), если я коснусь какого-либо места на экране

Просмотр изображения превратит стрелку в мою точку касания.

Но центр круга все еще остается прежним.

Я пытаюсь преобразовать изображение, используя тестовый угол

Это будет так ...

enter image description here

Как настроить изображение?

Также код здесь

- (void)viewDidLoad {
    CGRect arrowImageRect = CGRectMake(20.0f, 20.0f, 15.0f, 220.0f);
    arrow = [[UIImageView alloc] initWithFrame:arrowImageRect];
    [arrow setImage:[UIImage imageNamed:@"arrow.png"]];
    arrow.opaque = YES;
    [self.view addSubview:arrow];
    [super viewDidLoad];
}

- (void)touchesBegan:(NSSet *)touches withEvent:(UIEvent *)event{
    UITouch *touch = [touches anyObject];
    CGPoint touchPoint = [touch locationInView:self.view];
    NSLog(@"Position X: %f \n, Y: %f",touchPoint.x,touchPoint.y);
    CGAffineTransform transform = CGAffineTransformIdentity;
    arrow.transform = CGAffineTransformRotate(transform, ?????? );
}

??????часть должна быть последним решением ...

Или, может быть, мне нужно изменить размер изображения ???

Спасибо за любой ответ или ответ: -)

Уэббер

Ответы [ 3 ]

2 голосов
/ 04 ноября 2011

Вот окончательное решение, я понимаю эту проблему

проверьте этот код

-(void)touchesMoved:(NSSet *)touches withEvent:(UIEvent *)event
{
    UITouch *touch=[[event allTouches]anyObject];

    [self transformSpinnerwithTouches:touch];
}

-(void)transformSpinnerwithTouches:(UITouch *)touchLocation
{
    CGPoint touchLocationpoint = [touchLocation locationInView:self.view];
    CGPoint PrevioustouchLocationpoint = [touchLocation previousLocationInView:self.view];
    //origin is the respective piont from that i gonna measure the angle of the current position with respective to previous position ....
    CGPoint origin;
    origin.x = arrow.center.x;
    origin.y = arrow.center.y;
    CGPoint previousDifference = [self vectorFromPoint:origin toPoint:PrevioustouchLocationpoint];
    CGAffineTransform newTransform = CGAffineTransformScale(arrow.transform, 1, 1);
    CGFloat previousRotation = atan2(previousDifference.y, previousDifference.x);
    CGPoint currentDifference = [self vectorFromPoint:origin toPoint:touchLocationpoint];
    CGFloat currentRotation = atan2(currentDifference.y, currentDifference.x);
    CGFloat newAngle = currentRotation- previousRotation;
    temp1 = temp1 + newAngle;
    //NSLog(@"temp1 is %f",temp1);
    //NSLog(@"Angle:%F\n",(temp1*180)/M_PI);
    newTransform = CGAffineTransformRotate(newTransform, newAngle);
    [self animateView:arrow toPosition:newTransform];
}
-(void)animateView:(UIView *)theView toPosition:(CGAffineTransform) newTransform
{
arrow.transform = newTransform;
}

-(CGPoint)vectorFromPoint:(CGPoint)firstPoint toPoint:(CGPoint)secondPoint
{
    CGFloat x = secondPoint.x - firstPoint.x;
    CGFloat y = secondPoint.y - firstPoint.y;
    CGPoint result = CGPointMake(x, y);
    //NSLog(@"%f %f",x,y);
    return result;
}
0 голосов
/ 07 сентября 2011

Вы можете переустановить центр после преобразования.

CGPoint centerBeforeTransform = view.center;
//your transform code
view.center = centerBeforeTransform;
0 голосов
/ 07 сентября 2011

С документация о методе преобразования :

Источником преобразования является значение свойства center или свойства anchorPoint слоя, если оно было изменено. (Используйте свойство layer, чтобы получить базовый объект слоя Core Animation.) Значением по умолчанию является CGAffineTransformIdentity.

Таким образом, вы сможете установить центр своего вращения таким образом!

А для определения угла поворота используйте функцию atan2 или atan2f:

float angleInRadians = atan2f(touchPoint.y-circleCenter.y , touchPoint.x-circleCenter.x);
...