【问题标题】:For iOS 7.1, how can you scale an interface or screen to fit smaller iPhone models?对于 iOS 7.1,如何缩放界面或屏幕以适应较小的 iPhone 机型?
【发布时间】:2014-08-13 10:49:18
【问题描述】:

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

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

“缩小”是指当程序在较小的 iPhone(如 iPhone 4S、4、3G 或与 iOS 兼容的任何较小型号)上运行时,自动获取我在情节提要中布置的每个屏幕并按宽高比进行缩放7.1.

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

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

【问题讨论】:

    标签: ios iphone xcode layout interface-builder


    【解决方案1】:

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

    除此之外,我认为没有任何库可以实现这样的目标,而且根据你提到的有 50-60 个视图控制器,这肯定会花费你很多时间。抱歉,你应该早点决定你的应用程序在大小上的兼容性。所以一切顺利并继续编码。下一次,当开始使用应用程序时,一定要保持它的兼容性,以避免结束如此大量的工作。

    【讨论】:

    • 如何使用自动布局来做到这一点?更加详细一些。对于很多对象,我不得不取消选中该框,因为它搞砸了。实际上,我确实很早就决定该应用程序将兼容,但正如您可以告诉 iPad 和其他模拟器一样,IB 内置缩放似乎是常识,因为您可以设置 1x 和 2x,就好像运行应用程序在较大的 iPad 上的 iPhone 模拟器中。这就是我想要达到的目标。所以我很早就决定了,这似乎很有可能,因为对于 iPad Xcode 模拟器,您可以通过单击随意缩小或扩大所有内容。
    • 我确实点击了您的链接,但这是一个非常笼统的教程,并非针对我的问题。自动布局还指的是单个对象知道在屏幕上的位置,而不是大规模缩放一切以适应,这正是我正在寻找的。如果您需要更好的示例,请进入 Xcode,并为 iPad 模拟器运行/构建任何 iPhone 应用程序。看看如何在 1x 和 2x 之间切换?这种效果仅适用于较小的 iPhone。我想避免为每个对象都选中一个框,而且自动布局还涉及其他内容,所以请比发布链接或视频更具体。
    • 首先你写的评论只是让你听起来像菜鸟。那你为什么投票给我。此外,自动布局是您实现目标的唯一途径。您必须在视图控制器的每个组件上应用自动布局并运行/构建它并检查它是否适合两个屏幕。自动布局是一种让您的屏幕灵活适用于 iphone 和 ipad 的方式。也是的,这是我给你的一般链接,因为你不知道自动布局功能所以你不能跳到专家级别,除非你是超人(:D)
    • 到目前为止,我还没有看到任何可以在眨眼间完成目标的库。所以坐下来阅读它(自动布局),它的好处。那你可能知道了。如果您不了解苹果为 iphone 或 ipad 提供的功能,也不要一票否决。
    • 另外,如果您在观看屏幕时遇到任何令人惊讶的库,请告诉我。
    【解决方案2】:

    解决方案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
    

    【讨论】:

      猜你喜欢
      • 2014-04-16
      • 1970-01-01
      • 1970-01-01
      • 2011-05-12
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2012-05-19
      • 1970-01-01
      相关资源
      最近更新 更多