iPhone correct landscape window coordinates

前端 未结 5 1075
终归单人心
终归单人心 2021-02-15 15:31

I am trying to get the window coordinates of a table view using the following code:

[self.tableView.superview convertRect:self.tableView.frame toView:nil]

5条回答
  •  时光说笑
    2021-02-15 16:06

    I've found what I believe to be the beginnings of the solution. It seems the coordinates you and I are seeing are being based on the bottom left or top right, depending on whether the orientation is UIInterfaceOrientationLandscapeRight or UIInterfaceOrientationLandscapeLeft.

    I don't know why yet, but hopefully that helps. :)

    [UPDATE] So I guess the origin of the window is 0,0 in normal portrait mode, and rotates with the ipad/iphone.

    So here's how I solved this.

    First I grab my orientation, window bounds and the rect of my view within the window (with the wonky coordinates)

    UIInterfaceOrientation orientation = [[UIApplication sharedApplication] statusBarOrientation];
    CGRect windowRect = appDelegate.window.bounds;
    CGRect viewRectAbsolute = [self.guestEntryTableView convertRect:self.guestEntryTableView.bounds toView:nil];
    

    Then if the orientation is landscape, I reverse the x and y coordinates and the width and height

    if (UIInterfaceOrientationLandscapeLeft == orientation ||UIInterfaceOrientationLandscapeRight == orientation ) {
        windowRect = XYWidthHeightRectSwap(windowRect);
        viewRectAbsolute = XYWidthHeightRectSwap(viewRectAbsolute);
    }
    

    Then I call my function for fixing the origin to be based on the top left no matter the rotation of the ipad/iphone. It fixes the origin depending on where 0,0 currently lives (depending on the orientation)

    viewRectAbsolute = FixOriginRotation(viewRectAbsolute, orientation, windowRect.size.width, windowRect.size.height);
    

    Here are the two functions I use

    CGRect XYWidthHeightRectSwap(CGRect rect) {
        CGRect newRect;
        newRect.origin.x = rect.origin.y;
        newRect.origin.y = rect.origin.x;
        newRect.size.width = rect.size.height;
        newRect.size.height = rect.size.width;
        return newRect;
    }
    
    CGRect FixOriginRotation(CGRect rect, UIInterfaceOrientation orientation, int parentWidth, int parentHeight) {
        CGRect newRect;
        switch(orientation)
        {
            case UIInterfaceOrientationLandscapeLeft:
                newRect = CGRectMake(parentWidth - (rect.size.width + rect.origin.x), rect.origin.y, rect.size.width, rect.size.height);
                break;
            case UIInterfaceOrientationLandscapeRight:
                newRect = CGRectMake(rect.origin.x, parentHeight - (rect.size.height + rect.origin.y), rect.size.width, rect.size.height);
                break;
            case UIInterfaceOrientationPortrait:
                newRect = rect;
                break;
            case UIInterfaceOrientationPortraitUpsideDown:
                newRect = CGRectMake(parentWidth - (rect.size.width + rect.origin.x), parentHeight - (rect.size.height + rect.origin.y), rect.size.width, rect.size.height);
                break;
        }
        return newRect;
    }
    

提交回复
热议问题