Проверьте положение кнопки UIB после поворота UIView - PullRequest
1 голос
/ 13 января 2011

У меня есть кнопка, которую я добавляю в UIImageView.С помощью метода, когда пользователь касается экрана, UIImageView будет вращаться, я хочу знать, есть ли способ получить новую позицию кнопки после того, как вращение сделано.время исходной позиции с этим методом:

-(void)touchesEnded:(NSSet *)touches withEvent:(UIEvent *)event {

    NSLog(@"Xposition : %f", myButton.frame.origin.x);
    NSLog(@"Yposition : %f", myButton.frame.origin.y);

}

Спасибо,

1 Ответ

6 голосов
/ 13 января 2011

Это сложный вопрос.Ссылаясь на документацию UIView по свойству фрейма, оно гласит:

Предупреждение. Если свойство transform не является преобразованием тождеств, значение этого свойства не определено и поэтому должно игнорироваться.

Таким образом, хитрость заключается в поиске обходного пути, и это зависит от того, что именно вам нужно.Если вам просто нужно приближение или если ваш поворот всегда кратен 90 градусам, функция CGRectApplyAffineTransform () может работать достаточно хорошо.Передайте ему (нетрансформированный) кадр интересующего UIButton вместе с текущим преобразованием кнопки, и он даст вам преобразованный прямоугольник.Обратите внимание, что поскольку прямоугольник определен как начало координат, ширина и высота, он не может определять прямоугольник со сторонами, не параллельными краям экрана.В случае, если он не параллельный, он вернет наименьший возможный ограничивающий прямоугольник для повернутого прямоугольника.

Теперь, если вам нужно узнать точные координаты одной или всех преобразованных точек, янаписанный код для их вычисления раньше, но он немного сложнее:

- (void)computeCornersOfTransformedView:(UIView*)transformedView relativeToView:(UIView*)parentView {
    /*  Computes the coordinates of each corner of transformedView in the coordinate system 
     *  of parentView.  Each is corner represented by an independent CGPoint. Doesn't do anything
     *  with the transformed points because this is, after all, just an example.
     */

    // Cache the current transform, and restore the view to a normal position and size.
    CGAffineTransform cachedTransform = transformedView.transform;
    transformedView.transform = CGAffineTransformIdentity;

    // Note each of the (untransformed) points of interest.
    CGPoint topLeft = CGPointMake(0, 0);
    CGPoint bottomLeft = CGPointMake(0, transformedView.frame.size.height);
    CGPoint bottomRight = CGPointMake(transformedView.frame.size.width, transformedView.frame.size.height);
    CGPoint topRight = CGPointMake(transformedView.frame.size.width, 0);

    // Re-apply the transform.
    transformedView.transform = cachedTransform;

    // Use handy built-in UIView methods to convert the points.
    topLeft = [transformedView convertPoint:topLeft toView:parentView];
    bottomLeft = [transformedView convertPoint:bottomLeft toView:parentView];
    bottomRight = [transformedView convertPoint:bottomRight toView:parentView];
    topRight = [transformedView convertPoint:topRight toView:parentView];

    // Do something with the newly acquired points.
}

Прошу прощения за любые незначительные ошибки в коде, я написал это в браузере.Не самая полезная IDE ...

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...