2017-06-20 51 views
1

我们的项目针对所有iPAD运行,并且我们遇到了一个问题,例如我们有8个按钮垂直坐在屏幕上,约束被添加为垂直间距,它们在iPAD 9.7英寸上看起来很好,但它们在iPAD 12.9上看起来非常大,所以问题是,是否有任何好方法可以更好地使用屏幕空间,比如在iPAD 12.9中添加额外的UIView。我已经考虑过使用大小类,但我相信所有iPAD都有一个大小类,我想要的是如果有一种方法可以使用“接口”构建器为不同的iPAD大小创建不同的UI针对不同iPAD尺寸的不同用户界面

+0

你有UI的任何例子,你想达到什么目的? –

+0

这不是StackView应该做的吗?检查出来.. – Sti

+0

你不需要添加UIView,你可以通过以适当的方式设置约束来实现你的目标。在设置视图像关系,优先级,长宽比等内部有许多选项约束。 –

回答

3

我想你的情况的方法是,这个特定的ViewController有很多共同的东西,(像一个普通的顶栏,或导航栏),但只是中间的内容似乎并不适合正常。

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

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

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

要做到这一点,你必须按照下面的步骤。

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

2)创建一个UIView子类。

3)将接口构建器的属性挂钩到这个子类。请注意,您必须为您要使用的每个xib文件重复此过程。重要提示:尽管他们是不同的xibs,但他们都被吸引到同一个班级。

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 Size创建一个子类,以便每个人都拥有自己的ViewController + Interface Builder屏幕。然后只需加载所需的屏幕,就好像它是一个完全不同的屏幕。

+0

hey @Pochi,非常感谢答案,这是使用不同视图的好方法。但是我所拥有的一个问题是,如果我按照自己的方式使用这个视图,那么这个视图只需要一定的高度?我将如何做,而不是使用let screenRect:CGRect = UIScreen.main.bounds。如果我不给它一个高度会发生什么?另外,我可以在故事板中使用这个UIView类吗? –

+0

第一个问题:没有任何反应,只要它有适当的约束条件,它就会正确显示。您需要指定一个位置(如中心x和y)以及视图的大小。只要视图中的所有元素都具有相对位置,您就不需要指定高度。只要确保顶层元素具有相对于视图顶部的位置,然后相对于该最后一个元素位于顶层元素下方,直到最后一个元素具有相对于视图底部的位置。这种方法的很大一部分是你可以在IB上进行设计。 – Pochi

+0

第二个问题:是的。如果您使用我上面发布的代码,只需将UIView拖入界面构建器。然后将其设置为您自定义视图的一种类型。它应该自动显示为预览。但请记住,对于Interface Builder(IB)来渲染视图,它使用init?(coder aDecoder:NSCoder)方法中的代码。并且由于那个人调用“loadViewFromNib”,那里的条件将定义哪个XIB将被用作预览。 – Pochi

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] 
0

只是把约束,因为我建议如下看看Sample我已经为你创造。

  1. 给你的按钮长宽比。
  2. 给出的宽度等于父视图的宽度。
  3. 在容器中水平添加约束中心并在容器中垂直居中。
  4. 选择您的按钮,然后转到尺寸检查器并设置宽度的乘数(如0.3或0.4等)。
  5. 然后设置“align center X to ..”的乘数(如果你希望你的按钮位于中心左边,那么将乘数设置在1以下,比如0.8,0.7,0.5等等。如果你想让你的按钮位于右边然后设置乘数值大于1像1.2等)。
  6. 步骤设置“居中y以..”倍增器的值作为类似5

它全部搞定..只要运行和检查。

希望这会帮助你。

0

尝试这个

1.去除所有的按钮限制

  • 所有的按钮添加到stackview您stackview
  • 将垂直约束
  • 设置相同的高度相同的宽度为stackview按钮
  • 删除高度,如果你的任何按键
  • 不要为栈设置高度设置查看您是否希望它在不同的设备上运行。
  • 0

    您可以使用此

    所有按钮内嵌到视图,并设置其制约上海华。

    • 请确保为其添加纵横比约束。

    选择所有按钮和添加约束

    • 相等的宽度,相等的高度,长宽比
    0

    可以使用自动版式此。您可以将长宽比基本高度分配给您的按钮。请记住,可以将比率关系设置为“等于”或“小于等于”。你可以使用这些而不是给出确切的约束。所以这会导致按钮适应高度。然后在代码中,您可以简单地检查是否有足够的空间来绘制额外的uiview。这也将解决“看起来很大”的问题。

    检查IB这里的截图,看看有什么我指的是: Click on 'Relation' to see these settings