界面方向,拉伸和纵横比

时间:2012-02-08 08:55:03

标签: iphone cocoa-touch

-  (BOOL)    shouldAutorotateToInterfaceOrientation 
          : (UIInterfaceOrientation)interfaceOrientation;

上述方法在允许旋转发生方面按预期工作。但是我很难在保持宽高比的同时尝试UIView拉伸。

UIView在转换为横向模式时水平拉伸会发生什么,但无论我做什么,它都不会垂直伸展。事实上,它的高度在横向模式下会相当缩小。

在IB和代码中尝试了以下设置但没有用。

  • 在IB中,尝试了“Aspect Fit”,“Aspect Fill”和Autosizing Box
  • 在代码中,尝试过“autosizingMask”和“setContentMode”

希望有人能帮忙......

如果你做过/遇到过类似的事情,请留言。

编辑:

我想我找到了另一个SO问题的解决方案。发生的事情是我的代码与IB的AutoResizing功能的影响纠缠在一起。可以在我自己的答案中找到问题的链接。

2 个答案:

答案 0 :(得分:3)

首先,内容模式(使用setContentMode:设置或通过更改IB中的视图模式)对您没有用,因为它控制的是视图的内容为了响应大小的变化 - 它不能控制实际的大小变化。更重要的是,除非你把它设置为UIViewContentModeRedraw,否则内容不会被重新绘制,而是被移动或拉伸,这通常不是你想要的。

另一方面,设置自动调整遮罩(或使用IB中的自动调整大小)也无法获得所需的效果。 UIViewAutoresizingFlexibleWidth会改变视图的宽度,与其超视图大小的变化成比例(使用UIViewAutoresizingFlexibleLeftMargin和/或UIViewAutoresizingFlexibleLeftMargin此外还将控制是否与距离的侧边距离屏幕保持不变)。但是自动调整遮罩不能让你根据宽度的变化来改变高度:你可以让它与superview的高度成比例变化和/或坚持到顶部/底部

因此,您必须在willRotateToInterfaceOrientation:duration:中以编程方式自行管理调整大小。类似的东西:

- (void)willAnimateRotationToInterfaceOrientation:(UIInterfaceOrientation)toInterfaceOrientation duration:(NSTimeInterval)duration
{
    CGRect rectToResizeTo;

    if ((toInterfaceOrientation == UIInterfaceOrientationPortrait) || (toInterfaceOrientation == UIInterfaceOrientationPortraitUpsideDown)) {
        rectToResizeTo = CGRectMake(x1, y1, width1, height1);
    } else {
        rectToResizeTo = CGRectMake(x2, y2, width2, height2);
    }
    [UIView animateWithDuration:duration animations:^{
        self.viewToResize.frame = rectToResizeTo;
    }];
}

答案 1 :(得分:0)

对于那些有类似问题的人,可以在另一个SO问题中找到答案:Laying out & sizing of subviews in a UIViewController