自动调整视图会增加横向模式下视图之间的距离

时间:2014-01-28 03:26:04

标签: ios objective-c uiview uiinterfaceorientation autosize

我有iPhone个应用,它应支持landscapeportrait方向。我已将Use Autolayout设为NO

portrait方向,我的view显示为 enter image description here

landscape方向,我的view显示为 enter image description here

我为autosizing设置了views,如下图所示

enter image description here

为什么在横向模式下视图之间的距离会增加?任何人都可以帮助我吗?

1 个答案:

答案 0 :(得分:1)

如果我错了,有人可以纠正我,但似乎这对我来说是正确的行为。视图不会调整大小,也不会修复到超级视图的任何一侧。超级视图越来越宽,因此它们之间的区域变得更大。 如果您想将它们设置在某个位置并且不想使用自动布局,那么最好的方法就是在发生旋转时将帧设置在您想要的位置。您可以分两步完成此操作: 首先设置你的框架 - 我喜欢定义一个漂亮的结构如下

//Use this define to set frames for views
#define TAG_RECT( tag, x, y, width, height ) \
[NSValue valueWithCGRect:CGRectMake(x, y, width, height)], \
[NSNumber numberWithInteger:tag]

然后,您可以在viewDidLoad:中设置框架。通过在故事板中复制视图控制器并将其粘贴到侧面,这是了解视图放置位置的好方法。然后您可以将其更改为横向,并将视图精确放置在您想要的位置,然后查看位置和尺寸。别忘了为你的观点设置你的标签。

// Collect the frame positions for elements in portrait mode
    NSMutableDictionary *portraitPositions = [[NSMutableDictionary alloc] init];
// You only have two views, but if you have more its nice to do it in a loop
    for (NSInteger i = 1; i <= 2; i++) {
        UIView *view = [self.view viewWithTag:i];

        [portraitPositions setObject:[NSValue valueWithCGRect:view.frame] forKey:[NSNumber numberWithInteger:i]];
    }
    self.portraitFrames = [portraitPositions copy];

    // Let's build the landscape frame positions dictionary
    if ((UI_USER_INTERFACE_IDIOM() == UIUserInterfaceIdiomPad)) {
        //Set up frames for variables in iPad version
        self.landscapeFrames = [NSDictionary dictionaryWithObjectsAndKeys:
                                TAG_RECT(1, 325, 100, 375, 90),     // view one
                                TAG_RECT(2, 525, 100, 375, 90),     // view two 
                                nil];
    }

接下来,只要您的视图旋转,您就需要布局相应的框架集

- (void) willRotateToInterfaceOrientation:(UIInterfaceOrientation)toInterfaceOrientation duration:(NSTimeInterval)duration {
    if (UIInterfaceOrientationIsLandscape(self.interfaceOrientation)) {    
        // Lay out for landscape mode
        [self layoutForFrameSet:self.landscapeFrames];
    }
    else if (UIInterfaceOrientationIsPortrait(self.interfaceOrientation)) {
        // Lay out for portrait mode
        [self layoutForFrameSet:self.portraitFrames];
    }
}


- (void)layoutForFrameSet:(NSDictionary *)frames {
    for (NSNumber *key in frames.allKeys) {
        [self.view viewWithTag:[key integerValue]].frame = [[frames objectForKey:key] CGRectValue];
    }
}

很抱歉,如果这更复杂,但这是将您的观点准确放置在您想要的位置而不需要自动布局的最佳方式