开发者

Check UIButton position after rotating UIView

I have a buttonsthat I add on a UIImageView. With a m开发者_开发百科ethod when the user touch the screen the UIImageView will rotate, I want to know if there is a way to get the new position of the button after the rotation is done.

Right now I'm getting all the time the original position with this method :

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

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

}

Thanks,


This is a tricky question. Referring to the UIView documentation on the frame property it states:

Warning: If the transform property is not the identity transform, the value of this property is undefined and therefore should be ignored.

So the trick is finding a workaround, and it depends on what exactly you need. If you just need an approximation, or if your rotation is always a multiple of 90 degrees, the CGRectApplyAffineTransform() function might work well enough. Pass it the (untransformed) frame of the UIButton of interest, along with the button's current transform and it will give you a transformed rect. Note that since a rect is defined as an origin, width and height, it can't define a rectangle with sides not parallel to the screen edges. In the case that it isn't parallel, it will return the smallest possible bounding rectangle for the rotated rect.

Now if you need to know the exact coordinates of one or all of the transformed points, I've written code to compute them before, but it's a bit more involved:

- (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.
}

Please forgive any minor errors in the code, I wrote it in the browser. Not the most helpful IDE...

0

上一篇:

下一篇:

精彩评论

暂无评论...
验证码 换一张
取 消

最新问答

问答排行榜