针对不同iPAD尺寸的不同UI

时间:2017-06-20 19:53:03

标签: ios ipad xcode8 ipad-3

我们的项目适用于所有iPAD,我们遇到了一个问题,例如我们有8个按钮垂直放置在屏幕上,约束被添加为垂直间距,它们在iPAD 9.7英寸上看起来很好,但它们看起来很像在iPAD 12.9上真的很大,所以问题是,是否有任何好方法可以更好地使用屏幕空间,如果是iPAD 12.9则添加额外的UIView。我已经研究过使用大小类,但我相信所有iPAD都有一个大小类,我想要的是如果有一种方法可以使用Interface构建器为不同的iPAD大小设置不同的UI

6 个答案:

答案 0 :(得分:5)

我想象你的情况是这个特定的ViewController有很多共享的东西,(比如常见的顶栏或导航栏),但只是中间内容似乎不合适。

在这种情况下,建议使用自定义UIView,它将根据当前设备的高度或宽度加载不同的xib文件。

这里的关键点是,实际上只需要一个UIView子类。

为此,您也可以使用@IBDesignable在界面构建器中实时预览它。

要实现这一目标,您必须按照以下步骤进行操作。

1)为每个" UIViews"创建一个.xib文件。根据尺寸。

2)创建一个UIView子类。

3)将属性从接口构建器挂钩到此子类。请注意,您必须为要使用的每个xib文件重复此过程。重要提示:即使它们是不同的xib,它们都会被连接到同一个类中。

4)将创建的类标记为@IBDesignable,如下所示。

@IBDesignable class CustomView: UIView {
    ...
}

5)在您的类中添加以下代码,这些代码将根据您选择的条件加载不同的xib。

////////// View Logic //////////

// Our custom view from the XIB file
var view: UIView!

func xibSetup() {
    view = loadViewFromNib()

    // use bounds not frame or it'll be offset
    view.frame = bounds

    // Make the view stretch with containing view
    view.autoresizingMask = [UIViewAutoresizing.flexibleWidth, UIViewAutoresizing.flexibleHeight]
    // Adding custom subview on top of our view (over any custom drawing > see note below)
    addSubview(view)
}

func setup()
{
    // Extra setup goes here

}

func loadViewFromNib() -> UIView {

    let bundle = Bundle(for: type(of: self))

    let nib : UINib

    let screenRect : CGRect =  UIScreen.main.bounds;

    // Use a different Nib based on the current screen height

    if screenRect.size.height == 1024 {
        // iPad Air & Pro

        nib = UINib(nibName: "iPadNormal", bundle: bundle)
    }
    else if screenRect.size.height == 1366 {
        // Large iPad Pro

        nib = UINib(nibName: "iPadLarge", bundle: bundle)
    }
    else {
        // Fall back

        nib = UINib(nibName: "iPadFallback", bundle: bundle)
    }

    let view = nib.instantiate(withOwner: self, options: nil)[0] as! UIView

    return view
}


override init(frame: CGRect) {
    // 1. setup any properties here

    // 2. call super.init(frame:)
    super.init(frame: frame)

    // 3. Setup view from .xib file
    xibSetup()

    // 4. Other Setup
    setup()
}

required init?(coder aDecoder: NSCoder) {
    // 1. setup any properties here

    // 2. call super.init(coder:)
    super.init(coder: aDecoder)

    // 3. Setup view from .xib file
    xibSetup()  

    // 4. Other Setup
    setup()
}


////////////////

重要:

仅当自定义视图的内容相同或变化非常小(布局无关紧要)时,才建议使用此方法。如果内容在不同大小之间发生了很大变化(就像你实际上想要显示不同的东西那样)那么你应该创建一个" BaseViewController"使用您的共享逻辑,并根据iPad尺寸制作子类,以便每个人都拥有自己的ViewController + Interface Builder屏幕。然后只需加载所需的屏幕就好像它是一个完全不同的屏幕。

答案 1 :(得分:1)

按照我的建议添加约束查看我为您创建的Sample

  1. 提供按钮宽高比。
  2. 将宽度等于父视图的宽度。
  3. 在容器中水平添加约束中心,在容器中垂直添加中心。
  4. 选择您的按钮,然后转到尺寸检查器并设置宽度的乘数(如0.3或0.4等)。
  5. 然后设置“将中心X对齐...”的乘数(如果您希望按钮保持在中心位置,则将乘数设置为低于1,如0.8,0.7,0.5等。如果您希望按钮位于右侧然后将中心的乘数值设置为大于1,如1.2等)。
  6. 设置“将中心y​​对齐为”的乘数值,如步骤5中所示。
  7. 全部完成..只需运行并检查。

    希望这会对你有所帮助。

答案 2 :(得分:1)

您可以使用AutoLayout。您可以为按钮指定纵横比基准高度。请记住,可以选择将比率关系设置为“等于”或“小于等于”。您可以使用这些而不是给出确切的约束。所以这会使按钮适应高度。然后在代码中你可以简单地检查是否有足够的空间来绘制额外的uiview。这也将解决“看起来很大”的问题。

点击此处的IB截图,查看我所指的内容: Click on 'Relation' to see these settings

答案 3 :(得分:0)

假设您的笔尖是Foo_pro.xib和Foo_ipad.xib。

@implementation Util

+(BOOL) isIpad_1024
{
    if ([UIScreen mainScreen].bounds.size.height == 1024) {
        return  YES;
    }
    return NO;
}

+(BOOL) isIpadPro_1366
{
    if ([UIScreen mainScreen].bounds.size.height == 1366) {
        return  YES;
    }
    return NO;
}

+(NSString *)convertXib:(NSString *)nibName {
    if([Util isiPadPro_1366]) {
        return [NSString stringWithFormat:@"%@_pro", nibName];
    } else {
        return [NSString stringWithFormat:@"%@_ipad", nibName];
    }
}

Foo *foo = [[Foo alloc] initWithNibName:[Util convertXib:@"Foo"] bundle:nil]

答案 4 :(得分:0)

试试这个

1.从所有按钮中删除约束

  1. 将所有按钮添加到堆栈视图
  2. 在stackview上放置垂直约束
  3. 为stackview按钮设置相同的高度相同的宽度
  4. 如果设置了任何按钮,则移除高度
  5. 如果您希望在不同的设备上运行,请不要为stackview设置高度。

答案 5 :(得分:0)

您可以使用此

所有按钮都嵌入到视图中并设置为超视图的约束。

  • 确保为其添加宽高比限制。

选择所有按钮并添加约束

  • 等宽,等高,宽高比