【问题标题】:What is the height of the new iOS 10 Today Widget/Extension?新的 iOS 10 Today Widget/Extension 的高度是多少?
【发布时间】:2016-11-02 21:35:48
【问题描述】:

我正在构建一个 iOS Today 小部件,在测试 iOS 10 时,我注意到所有小部件现在都被赋予了相同的高度(以前的版本允许开发人员设置高度)。什么是理想的高度/处理这个新限制的最佳实践是什么?我很快,我没有使用自动布局仅供参考。提前致谢!

【问题讨论】:

    标签: ios objective-c swift ios10 today-extension


    【解决方案1】:

    在 iOS 10 中,默认情况下,今天小部件的高度是固定的。此外,折叠的小部件的最小高度是有限的。

    折叠的小部件是大约两个半表格行的高度。理想情况下,展开的小部件不高于屏幕高度。

    这些笔记来自iOS Human Interface Guidelines

    我们可以做以下改变。

    首先,您需要在viewDidLoad 中添加这些代码,这使您的小部件支持iOS 10 中新增的两种模式。

    Swift 版本:

    if #available(iOSApplicationExtension 10.0, *) { // Xcode would suggest you implement this.
        extensionContext?.widgetLargestAvailableDisplayMode = .expanded
    } else {
        // Fallback on earlier versions
    }
    

    ObjC 版本:

    self.extensionContext.widgetLargestAvailableDisplayMode = NCWidgetDisplayModeExpanded;
    

    然后实现协议方法如:

    Swift 版本:

    @available(iOSApplicationExtension 10.0, *)
    func widgetActiveDisplayModeDidChange(activeDisplayMode: NCWidgetDisplayMode, withMaximumSize maxSize: CGSize) {
        if activeDisplayMode == .expanded {
            preferredContentSize = CGSize(width: 0.0, height: 200.0)
        } else if activeDisplayMode == .compact {
            preferredContentSize = maxSize
        }
    }
    

    ObjC 版本:

    - (void)widgetActiveDisplayModeDidChange:(NCWidgetDisplayMode)activeDisplayMode withMaximumSize:(CGSize)maxSize {
        if (activeDisplayMode == NCWidgetDisplayModeExpanded) {
            self.preferredContentSize = CGSizeMake(0.0, 200.0);
        } else if (activeDisplayMode == NCWidgetDisplayModeCompact) {
            self.preferredContentSize = maxSize;
        }
    }
    

    运行您的目标,您将在小部件的右上角看到一个“显示更多”按钮。点击它,你会看到变化。

    查看更多详情:How to resize the height of widget in iOS 10?

    【讨论】:

    • 感谢您的完整指导!
    【解决方案2】:

    如您所见,iOS 10 中的小部件已更改,现在具有固定高度。今天的扩展还添加了新功能。其中一个是NCWidgetDisplayMode。基本上,您在右上角有一个按钮,您可以在其中“显示更多”或“显示更少”。

    首先将以下内容添加到您的viewDidLoad()

    self.preferredContentSize = CGSize(width: 0, height: 200)
    
    if #available(iOSApplicationExtension 10.0, *) {
        self.extensionContext?.widgetLargestAvailableDisplayMode = .expanded
    } else {
        // Fallback on earlier versions
    }
    

    然后你需要做的就是基本上添加以下方法:

    Swift 版本:

    @available(iOSApplicationExtension 10.0, *)
    func widgetActiveDisplayModeDidChange(activeDisplayMode: NCWidgetDisplayMode, withMaximumSize maxSize: CGSize) {
        if activeDisplayMode == NCWidgetDisplayMode.Compact {
            self.preferredContentSize = CGSizeMake(0.0, 200.0)
        }
        else if activeDisplayMode == NCWidgetDisplayMode.Expanded {
            self.preferredContentSize = desiredSize
        }
    
    }
    

    Objective-C 版本:

    - (void)widgetActiveDisplayModeDidChange:(NCWidgetDisplayMode)activeDisplayMode withMaximumSize:(CGSize)maxSize{
        if (activeDisplayMode == NCWidgetDisplayModeCompact){
            self.preferredContentSize = CGSizeMake(0.0, 200.0);
        }
        else if (activeDisplayMode == NCWidgetDisplayModeExpanded){
            self.preferredContentSize = desiredSize;
        }
    }
    

    注意两点:

    Xcode 会自动建议您为 iOS 版本添加可用的检查(至少对于 Swift)。 所以不要删除旧的方法 self.preferredContentSize = CGSizeMake... 对于旧的 iOS 版本仍然需要。

    widgetActiveDisplayModeDidChange函数中activeDisplayMode == NCWidgetDisplayMode.Compact将在您从“显示更多”>“显示更少”时调用。这是因为它会立即从 iOS 系统触发。当您从“显示更少”>“显示更多”时,activeDisplayMode == NCWidgetDisplayMode.Expanded 将被调用。

    最后一件事,“显示更多”和“显示更少”按钮仍然存在问题,Apple 尚未修复。 Check the demonstration 来自 Apples Keynote,你会注意到他遇到了这个问题。

    【讨论】:

    • ? 为发现 Apple 漏洞竖起大拇指,这也证明了他们如何像大师一样摆脱困境。 :)
    【解决方案3】:

    只需执行以下操作:

    let height = extensionContext?.widgetMaximumSize(for: .compact).height
    

    您可以同时使用:.compact.expanded 类型。

    【讨论】:

    • 这真是一个很酷的方法。我寻求了很多,并尝试在终生回调中获得正确的大小,例如 viewDidAppear 和 viewWillTransition。但这些方式并不理想。因为在回调中设置正确的框架会导致小部件看起来令人耳目一新和重绘,这是令人不快的。谢谢。我可以使用它在 viewDidLoad 中设置正确的框架。
    猜你喜欢
    • 1970-01-01
    • 2014-09-09
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-07-29
    • 2014-10-22
    相关资源
    最近更新 更多