検出された場合、iOS の外部モニターに UIView を表示しようとしています。次のコードを使用して、単純な UIView を検出して表示できます...
public void CheckForExternalDisplay()
{
if (UIScreen.Screens.Length > 1)
{
Mvx.Trace(MvxTraceLevel.Diagnostic, "Multiple screens found");
var externalScreen = UIScreen.Screens[1];
var rect = new RectangleF(new PointF(0, 0), externalScreen.AvailableModes.Max(m => m).Size);
var window = new UIWindow(rect)
{
Screen = UIScreen.Screens[1],
ClipsToBounds = true,
Hidden = false
};
var presenterView = new PresenterView(rect);
window.AddSubview(presenterView);
}
}
この UIView はとてもシンプルです。UILabel と RadialProgress ビューが含まれています。値がどうあるべきかを決定するための重労働のほとんどは、電話の画面に添付されたビューを更新している別のビューモデルで既に行われています。外部ディスプレイの UIView を更新するためにいくつかの手法を試しました。
- MvxMessenger を使用します。- 新しい ViewModel と View 自体の両方にメッセージを渡そうとしました。新しいビューモデルは、発行ビューモデルから新しいインスタンスを作成した後にのみメッセージを受け取りました。ただし、ビューから直接メッセージを傍受することはできませんでした...
- バインドされたビューモデルのプロパティが別のビューモデルから単純に更新される遅延バインディングと通常の流暢なバインディング。
- このビューを別のビューに既に関連付けられているビューモデルにバインドしようとしました。
- 片手で願い事をし、もう一方の手でクラップ...どちらが先にいっぱいになったか当ててみてください ;)
UIview(以下)がビューモデルに登録/関連付けられていないかのようです。私はどこかで何かが欠けていると確信しています。いつものように、私は助けに感謝します!
public sealed class PresenterView
: MvxView
{
private readonly RadialProgressView _progressView;
private readonly MvxSubscriptionToken _token;
private IMvxMessenger _messenger;
private UILabel _displayLabel;
public PresenterView(RectangleF frame)
: base(frame)
{
Frame = frame;
_messenger = Mvx.Resolve<IMvxMessenger>();
_token = _messenger.Subscribe<DisplayMessage>(OnDisplayMessageReceived);
_displayLabel = new UILabel
{
AdjustsFontSizeToFitWidth = true,
Lines = 1,
LineBreakMode = UILineBreakMode.TailTruncation,
Text = "This is a workout",
Font = UIFont.FromName("rayando", 96f),
BackgroundColor = UIColor.Clear,
PreferredMaxLayoutWidth = Frame.Width - 10,
Frame = new RectangleF(0, 0, Frame.Width - 10, frame.Height / 7),
TextColor = UIColor.White,
TextAlignment = UITextAlignment.Center,
AutoresizingMask = UIViewAutoresizing.All
};
AddSubview(_displayLabel);
_progressView = new RadialProgressView
{
Center = new PointF(Center.X, Center.Y),
MinValue = 0f,
};
AddSubview(_progressView);
this.DelayBind(() =>
{
MvxFluentBindingDescriptionSet<PresenterView, PresenterViewModel> set =
this.CreateBindingSet<PresenterView, PresenterViewModel>();
set.Bind(_progressView).For(pv => pv.Value).To(vm => vm.ClockValue);
set.Bind(_progressView).For(pv => pv.MaxValue).To(vm => vm.MaxProgress);
set.Bind(_workoutLabel).To(vm => vm.DisplayText);
set.Apply();
});
}
private void OnDisplayMessageReceived(DisplayMessage obj)
{
_workoutLabel.Text = obj.Message;
}
}
ここに両方のソリューションを含めたことを認識しています。私はそれらのそれぞれを独立して試しました。