对于iOS 7.1,如何扩展界面或屏幕以适应较小的iPhone型号?

时间:2014-06-23 11:52:10

标签: ios iphone xcode layout interface-builder

如果问题已在其他地方得到解答,请提前道歉,但我已经搜索过,发现没有相应的解决方案。如果已经制作了,请随时链接我。

我为4英寸iPhone 5 / 5c / 5s构建了一个完整的故事板应用程序(在xib文件中有大约50-60个视图控制器布局),我正在寻找一种缩小屏幕的方法。 / p>

缩小"缩小"我的意思是当程序在较小的iPhone上运行时,我会自动将我在故事板中布置的每个屏幕都按照方面进行缩放,例如iPhone 4S,4,3G或任何与iOS 7.1兼容的小型号。

我没有时间单独更改故事板上每个布局项目的配置,因为这相当于1000个对象,因此请限制您对更大规模的任何答案或建议。当然,必须存在一些库的方法,它允许我们将所有内容移动到较小的iPhone上的较小窗口中,而无需剪切或裁剪。即使缩小/缩小导致模糊或字体不太明显,这对于屏幕的整个部分变得离屏也是更可取的。

允许简单方面比例的全局设置,将storyPhoneWidth / iPhone5Width中的每个对象的每个维度乘以水平维度和destinationPhoneHeight / iPhone5Height将是一个令人满意的解决方案。我不知道存在一个......

2 个答案:

答案 0 :(得分:0)

有一个解决方案可以实现您的目标,即AUTOLAYOUT

除此之外,我认为没有任何图书馆可以达到这样的目标,而且肯定会花费你很多时间,因为你提到50-60视图控制器。抱歉,您应该早点决定是否支持您的应用的大小。所以最好用它并保持编码。还有下一次,当从app开始时,请保持其兼容性,以避免最后的大量工作。

答案 1 :(得分:0)

解决方案1.使用仿射变换

几年前,我将iPad布局缩放到iPhone尺寸,没有自动布局。解决方案是将an affine transform应用于您的视图层次结构,如下所示:

containerView.transform = CGAffineTransformMakeScale(myScale, myScale);

以下是您必须考虑的一些细节。

  • 您可能需要将缩放变换与某些翻译变换连接起来才能正确定位视图。连接的顺序很重要。
  • 小心使用仿射变换和自动布局。它们一起工作,但它们的行为可能会在不同的iOS版本中发生变化。此外,您可能需要添加一些翻译,包括仿射变换和自动布局。
  • 我会将所有VC包装到根container VC,这解决了缩放的任务。但是,直接缩放UIWindow也可能有效,我还没有对此进行测试。
  • 您的视图层次结构仍将呈现原始大小的画布,该大小将缩小。所以你会有些模糊。

解决方案2.在运行时递归调整所有帧/约束

我在当前项目中使用此方法来调整不同设备的布局。我们的想法是在从nib加载后立即获取您的视图,并递归遍历它,将每个大小相乘。不仅是框架,还有字体大小,边框宽度等。

如果没有自动布局,您必须直接操作帧。使用自动布局,您必须采用每个约束并乘以其常量。

以下是使用自动布局解决此任务的类别。它会处理UILabelUITextFieldUITextViewUIButton中的字体大小,并且您必须使用其他所需的视图手动扩展它。此外,您还必须在自定义视图中覆盖-zoomCustomAttributesWithScale:-shouldMultiplySubviews:

@interface UIView (MultiplyLayout)
- (void)zoomLayoutWithScale:(CGFloat)scale;
- (BOOL)shouldMultiplySubviews;
- (void)zoomCustomAttributesWithScale:(CGFloat)scale;
@end

@implementation UIView (MultiplyLayout)

- (void)zoomLayoutWithScale:(CGFloat)scale {
    CGRect oldFrame = self.frame;
    CGRect newFrame = oldFrame;
    newFrame.size.width *= scale;
    newFrame.size.height *= scale;

    for (NSLayoutConstraint *constraint in self.constraints)
        constraint.constant *= scale;

    if (self.shouldMultiplySubviews)
        for (UIView *subview in self.subviews)
            [subview zoomLayoutWithScale:scale];

    [self zoomCustomAttributesWithScale:scale];
    self.frame = newFrame;
}

- (void)zoomCustomAttributesWithScale:(CGFloat)scale {
}

- (BOOL)shouldMultiplySubviews {
    return (self.class == [UIView class] ||
            self.class == [UIScrollView class]);
}

@end


@interface UIFont (MultiplyLayout)
- (instancetype)zoomedWithScale:(CGFloat)scale;
@end

@implementation UIFont (MultiplyLayout)

- (instancetype)zoomedWithScale:(CGFloat)scale {
    return [UIFont fontWithName:self.fontName size:self.pointSize * scale];
}

@end

@implementation UILabel (MultiplyLayout)
- (void)zoomCustomAttributesWithScale:(CGFloat)scale {
    self.font = [self.font zoomedWithScale:scale];
}
@end

@implementation UITextField (MultiplyLayout)
- (void)zoomCustomAttributesWithScale:(CGFloat)scale {
    self.font = [self.font zoomedWithScale:scale];
}
@end

@implementation UITextView (MultiplyLayout)
- (void)zoomCustomAttributesWithScale:(CGFloat)scale {
    self.font = [self.font zoomedWithScale:scale];
}
@end

@implementation UIButton (MultiplyLayout)
- (void)zoomCustomAttributesWithScale:(CGFloat)scale {
    self.titleLabel.font = [self.titleLabel.font zoomedWithScale:scale];
}
@end