通用应用程序中完全不同的 iPad 用户界面

Posted

技术标签:

【中文标题】通用应用程序中完全不同的 iPad 用户界面【英文标题】:Completely different UI for iPad in a universal app 【发布时间】:2019-08-03 07:50:10 【问题描述】:

我通常将自动布局与尺寸类一起使用,以优化大屏幕的 UI,例如在 iPad 上。

但是,有时我需要为 iPad 上的 UI 提供完全不同的布局,仍然包含相同的视图控制器,但结构不同。

在这种情况下,自动布局和大小类还不够用时,最好的策略是什么?正在为 iPad 加载不同的故事板?

显然这里的目标是不引入任何代码重复。

谢谢

【问题讨论】:

【参考方案1】:

为 iPad 加载不同的故事板?显然这里的目标是不引入任何代码重复。

如果这是您想要做的,那么该功能是内置的并且是预期的。你根本不需要任何代码。只需创建两个故事板并编辑 Info.plist 使其有两个指向它们的主要故事板条目:

正确的事情会发生:在 iPad 上,第二个故事板将在启动时加载。

【讨论】:

工作可下载示例(来自我的书)在这里:github.com/mattneub/Programming-ios-Book-Examples/tree/master/… - 查看 Info.plist【参考方案2】:

我对 UIViews 和 NSLayoutConstraints 上的尺寸类做同样的事情,例如,如果我有不同的 pad 和 phone 视图,但我必须对部分执行相同的逻辑,我在同一个故事板中创建两个不同的视图并启用/禁用视图基于尺寸等级

【讨论】:

我明白了,当您说“启用/禁用”时,您的意思是隐藏属性吗? 不,我的意思是你可以从故事板安装和卸载视图【参考方案3】:

在一个类文件中使用 2 个视图(xib)。两个 xib 中的连接数必须相同,但 iPad 和 iPhone 的元素位置可能不同。

下面是我从视图控制器加载 XIB 的代码。

class ViewController: UIViewController 

var customView:CustomView?

override func viewDidLoad() 
    super.viewDidLoad()
    // Do any additional setup after loading the view.
    loadCustomView()


func loadCustomView()
    if  let appDelegate =  UIApplication.shared.delegate as? AppDelegate,
        let window = appDelegate.window 
        customView = CustomView(frame: CGRect(x: 0, y: 0, width: window.frame.width, height: window.frame.height))
        window.addSubview(customView!)
    


然后是 UIView 类

import UIKit

class CustomView: UIView 

@IBOutlet weak var lbl_Title: UILabel!

var view:UIView!

override init(frame: CGRect) 
    super.init(frame: frame)
    setup()


required init(coder aDecoder: NSCoder) 
    super.init(coder: aDecoder)!
    setup()


func setup() 

    view = loadViewFromNib()
    view.frame = bounds
    view.autoresizingMask = UIView.AutoresizingMask.flexibleWidth
    view.autoresizingMask = UIView.AutoresizingMask.flexibleHeight
    addSubview(view)


func loadViewFromNib() -> UIView 
    if UIDevice.current.userInterfaceIdiom == .phone
        let bundle = Bundle(for:type(of: self))
        let nib = UINib(nibName: "CustomView", bundle: bundle)
        let view = nib.instantiate(withOwner: self, options: nil)[0] as! UIView
        return view
    else
        let bundle = Bundle(for:type(of: self))
        let nib = UINib(nibName: "CustomViewTab", bundle: bundle)
        let view = nib.instantiate(withOwner: self, options: nil)[0] as! UIView
        return view
    



您从这个类建立到两个 XIB 的出口连接,并根据设备类型加载视图。

【讨论】:

你如何加载一个xib而不是另一个?您是否以编程方式检查它是否是 ipad?

以上是关于通用应用程序中完全不同的 iPad 用户界面的主要内容,如果未能解决你的问题,请参考以下文章

Ipad 应用程序形成通用应用程序不同大小

App Thinning Size Report 报告的大小与 App Store 大小完全不同

我可以让我的通用应用在 iPhone 和 iPad 之间有不同的显示名称吗

是否可以在通用应用程序中仅使用一个故事板为 iPod 和 iPad 提供不同数量的视图控制器?

iOS通用屏幕设计

iPhone & iPad:通用应用程序,我的用户需要哪个操作系统版本?