iOS 11 上的 Xamarin Today 小部件几乎所有时间都无法显示更多
Almost all time cannot show more for Xamarin Today widget on iOS 11
我有今天的小部件,但有时 "show more" 无法使用。此问题仅在 iOS 11 中出现,之前的版本(8、9、10)运行良好。我不明白我做错了什么以及为什么我不能扩展小部件。我调查了这个问题,发现 "WidgetPerformUpdate" 在 "WidgetActiveDisplayModeDidChange" 内更改 "PreferredContentSize" 后未触发,这是因为 "View.Bounds" 小部件在更改 "PreferredContentSize" 后未更改.
这是我的代码示例:
[Register ("TodayViewController")]
public class TodayViewController : UIViewController, INCWidgetProviding
{
private const int PreferredHeight = 300;
private readonly ISettings _settings;
public TodayViewController(IntPtr handle) : base (handle)
{
_settings = AppContainer.Resolve<ISettings>();
}
static TodayViewController()
{
AppContainer.Container = (new iOSAppSetup()).CreateContainer();
}
public override void ViewDidLoad()
{
base.ViewDidLoad();
AddOpenApplicationEvent();
// Tell widget it can be expanded
ExtensionContext.SetWidgetLargestAvailableDisplayMode(NCWidgetDisplayMode.Expanded);
// Get the maximum size
var maxSize = ExtensionContext.GetWidgetMaximumSize(NCWidgetDisplayMode.Expanded);
PreferredContentSize = new CGSize(maxSize.Width, PreferredHeight);
View.AddSubview(***view according to maxSize***);
}
private void AddOpenApplicationEvent()
{
var tapWidget = new UITapGestureRecognizer();
tapWidget.AddTarget(() =>
{
UIApplication.SharedApplication.OpenUrl(new NSUrl("test://"));
});
View.AddGestureRecognizer(tapWidget);
}
[Export("widgetPerformUpdateWithCompletionHandler:")]
public void WidgetPerformUpdate(Action<NCUpdateResult> completionHandler)
{
UpdateWidget();
switch (ExtensionContext.GetWidgetActiveDisplayMode())
{
case NCWidgetDisplayMode.Compact:
// changes according to compact mode
break;
case NCWidgetDisplayMode.Expanded:
// changes according to expanded mode
break;
}
completionHandler(NCUpdateResult.NewData);
}
[Export("widgetActiveDisplayModeDidChange:withMaximumSize:")]
public void WidgetActiveDisplayModeDidChange(NCWidgetDisplayMode activeDisplayMode, CGSize maxSize)
{
// Take action based on the display mode
switch (activeDisplayMode)
{
case NCWidgetDisplayMode.Compact:
PreferredContentSize = maxSize;
// changes according to compact mode
break;
case NCWidgetDisplayMode.Expanded:
PreferredContentSize = new CGSize(maxSize.Width, PreferredHeight);
// changes according to expanded mode
break;
}
}
private void UpdateWidget()
{
// some updates
}
P.S。有时它会在通过小部件导航到应用程序后工作。
在 iOS-11 中,Show More/Show Less
也工作正常。
我创建了一个基本示例来描述这一点:
class TodayViewController: UIViewController, NCWidgetProviding
{
override func viewDidLoad()
{
super.viewDidLoad()
self.extensionContext?.widgetLargestAvailableDisplayMode = .expanded
}
func widgetPerformUpdate(completionHandler: (@escaping (NCUpdateResult) -> Void))
{
completionHandler(NCUpdateResult.newData)
}
func widgetActiveDisplayModeDidChange(_ activeDisplayMode: NCWidgetDisplayMode, withMaximumSize maxSize: CGSize)
{
if activeDisplayMode == .expanded
{
preferredContentSize = CGSize(width: 0.0, height: 300.0)
}
else
{
preferredContentSize = maxSize
}
}
}
我有今天的小部件,但有时 "show more" 无法使用。此问题仅在 iOS 11 中出现,之前的版本(8、9、10)运行良好。我不明白我做错了什么以及为什么我不能扩展小部件。我调查了这个问题,发现 "WidgetPerformUpdate" 在 "WidgetActiveDisplayModeDidChange" 内更改 "PreferredContentSize" 后未触发,这是因为 "View.Bounds" 小部件在更改 "PreferredContentSize" 后未更改.
这是我的代码示例:
[Register ("TodayViewController")]
public class TodayViewController : UIViewController, INCWidgetProviding
{
private const int PreferredHeight = 300;
private readonly ISettings _settings;
public TodayViewController(IntPtr handle) : base (handle)
{
_settings = AppContainer.Resolve<ISettings>();
}
static TodayViewController()
{
AppContainer.Container = (new iOSAppSetup()).CreateContainer();
}
public override void ViewDidLoad()
{
base.ViewDidLoad();
AddOpenApplicationEvent();
// Tell widget it can be expanded
ExtensionContext.SetWidgetLargestAvailableDisplayMode(NCWidgetDisplayMode.Expanded);
// Get the maximum size
var maxSize = ExtensionContext.GetWidgetMaximumSize(NCWidgetDisplayMode.Expanded);
PreferredContentSize = new CGSize(maxSize.Width, PreferredHeight);
View.AddSubview(***view according to maxSize***);
}
private void AddOpenApplicationEvent()
{
var tapWidget = new UITapGestureRecognizer();
tapWidget.AddTarget(() =>
{
UIApplication.SharedApplication.OpenUrl(new NSUrl("test://"));
});
View.AddGestureRecognizer(tapWidget);
}
[Export("widgetPerformUpdateWithCompletionHandler:")]
public void WidgetPerformUpdate(Action<NCUpdateResult> completionHandler)
{
UpdateWidget();
switch (ExtensionContext.GetWidgetActiveDisplayMode())
{
case NCWidgetDisplayMode.Compact:
// changes according to compact mode
break;
case NCWidgetDisplayMode.Expanded:
// changes according to expanded mode
break;
}
completionHandler(NCUpdateResult.NewData);
}
[Export("widgetActiveDisplayModeDidChange:withMaximumSize:")]
public void WidgetActiveDisplayModeDidChange(NCWidgetDisplayMode activeDisplayMode, CGSize maxSize)
{
// Take action based on the display mode
switch (activeDisplayMode)
{
case NCWidgetDisplayMode.Compact:
PreferredContentSize = maxSize;
// changes according to compact mode
break;
case NCWidgetDisplayMode.Expanded:
PreferredContentSize = new CGSize(maxSize.Width, PreferredHeight);
// changes according to expanded mode
break;
}
}
private void UpdateWidget()
{
// some updates
}
P.S。有时它会在通过小部件导航到应用程序后工作。
在 iOS-11 中,Show More/Show Less
也工作正常。
我创建了一个基本示例来描述这一点:
class TodayViewController: UIViewController, NCWidgetProviding
{
override func viewDidLoad()
{
super.viewDidLoad()
self.extensionContext?.widgetLargestAvailableDisplayMode = .expanded
}
func widgetPerformUpdate(completionHandler: (@escaping (NCUpdateResult) -> Void))
{
completionHandler(NCUpdateResult.newData)
}
func widgetActiveDisplayModeDidChange(_ activeDisplayMode: NCWidgetDisplayMode, withMaximumSize maxSize: CGSize)
{
if activeDisplayMode == .expanded
{
preferredContentSize = CGSize(width: 0.0, height: 300.0)
}
else
{
preferredContentSize = maxSize
}
}
}