5

我希望以编程方式更改今天扩展的高度。随着 iOS10 SDSK 的介绍NCWidgetDisplayMode,我正在尝试使用它以编程方式更改preferredContentSize.

我已经实施widgetActiveDisplayModeDidChange

@available(iOSApplicationExtension 10.0, *)
func widgetActiveDisplayModeDidChange(activeDisplayMode: NCWidgetDisplayMode, withMaximumSize maxSize: CGSize) {
    if (activeDisplayMode == NCWidgetDisplayMode.Compact) {
        self.preferredContentSize = maxSize
    }
    else {
        self.preferredContentSize = CGSize(width: maxSize.width, height: 280)
    }
}

我希望在UIButton按下 a 时扩展小部件高度:

@IBAction func multiplybyonethousand (sender: AnyObject) {

    if self.extensionContext?.widgetActiveDisplayMode == NCWidgetDisplayMode.Compact {

        self.widgetActiveDisplayModeDidChange(.Expanded, withMaximumSize: CGSizeMake(0, 300))
    }
}

但是,当我运行我的代码时,今天扩展的高度没有改变,并且控制台给了我以下错误:

2016-11-05 14:24:29.425697 todayextension[28590:7222420] No active animation block!

我试图widgetActiveDisplayModeDidChange在动画块内调用:

@IBAction func multiplybyonethousand (sender: AnyObject) {
        if self.extensionContext?.widgetActiveDisplayMode == NCWidgetDisplayMode.Compact {
            UIView.animateWithDuration(0.2, delay: 0, options: .CurveLinear, animations: { () -> Void in
                self.widgetActiveDisplayModeDidChange(.Expanded, withMaximumSize: CGSizeMake(0, 300))

            }) { (completed) -> Void in
             //Do Stuff
            }
        }
}

但我仍然收到No active animation block!错误消息。有没有办法在 iOS10 中以编程方式扩展今天的扩展视图?

4

1 回答 1

10

iOS 10中,Show More/Show Less按钮是自动提供的Today's Extension。所以高度widget是通过自动处理的NCWidgetDisplayMode。您不需要提供任何显式按钮来处理小部件的高度。

override func viewDidLoad() {
    super.viewDidLoad()

    if #available(iOSApplicationExtension 10.0, *) {
        self.extensionContext?.widgetLargestAvailableDisplayMode = .expanded
    }
}

实现NCWidgetProviding协议的方法:

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

iOS 8iOS 9中,您需要显式处理小部件的高度。在iOS 10中,它不是必需的。

您可以参考https://github.com/pgpt10/Today-WidgetToday's Widget,iOS 8iOS 9.iOS 10

于 2016-11-14T15:03:05.897 回答