protected virtual void OnElementChanged(VisualElementChangedEventArgs e) { if (e.OldElement != null) { e.OldElement.PropertyChanged -= HandlePropertyChanged; } if (e.NewElement != null) { e.NewElement.PropertyChanged += HandlePropertyChanged; } if (UIDevice.CurrentDevice.Orientation == UIDeviceOrientation.LandscapeLeft || UIDevice.CurrentDevice.Orientation == UIDeviceOrientation.LandscapeRight) { PreferredDisplayMode = UISplitViewControllerDisplayMode.AllVisible; } else if (UIDevice.CurrentDevice.Orientation == UIDeviceOrientation.Portrait || UIDevice.CurrentDevice.Orientation == UIDeviceOrientation.PortraitUpsideDown) { PreferredDisplayMode = UISplitViewControllerDisplayMode.PrimaryOverlay; } MasterWidth = 400; MasterDetailPage.Master.WidthRequest = 400; MasterDetailPage.UpdateMasterBehavior(); var changed = ElementChanged; if (changed != null) { changed(this, e); } UpdateControllers(); }
public override void WillRotate(UIInterfaceOrientation toInterfaceOrientation, double duration) { // On IOS8 the MasterViewController ViewAppear/Disappear weren't being called correctly after rotation // We now close the Master by using the new SplitView API, basicly we set it to hidden and right back to the Normal/AutomaticMode if (!MasterDetailPage.ShouldShowSplitMode && _masterVisible) { MasterDetailPage.CanChangeIsPresented = true; PreferredDisplayMode = UISplitViewControllerDisplayMode.PrimaryHidden; PreferredDisplayMode = UISplitViewControllerDisplayMode.Automatic; } MasterDetailPage.UpdateMasterBehavior(); MessagingCenter.Send <IVisualElementRenderer>(this, NavigationRenderer.UpdateToolbarButtons); base.WillRotate(toInterfaceOrientation, duration); }
void UpdateMasterBehavior(CGSize newBounds) { MasterDetailPage masterDetailPage = _masterDetailPage ?? Element as MasterDetailPage; if (masterDetailPage == null) { return; } bool isPortrait = newBounds.Height > newBounds.Width; var previous = PreferredDisplayMode; switch (masterDetailPage.MasterBehavior) { case MasterBehavior.Split: PreferredDisplayMode = UISplitViewControllerDisplayMode.AllVisible; break; case MasterBehavior.Popover: PreferredDisplayMode = UISplitViewControllerDisplayMode.PrimaryHidden; break; case MasterBehavior.SplitOnPortrait: PreferredDisplayMode = (isPortrait) ? UISplitViewControllerDisplayMode.AllVisible : UISplitViewControllerDisplayMode.PrimaryHidden; break; case MasterBehavior.SplitOnLandscape: PreferredDisplayMode = (!isPortrait) ? UISplitViewControllerDisplayMode.AllVisible : UISplitViewControllerDisplayMode.PrimaryHidden; break; default: PreferredDisplayMode = UISplitViewControllerDisplayMode.Automatic; break; } if (previous == PreferredDisplayMode) { return; } if (!MasterDetailPage.ShouldShowSplitMode) { MasterDetailPage.CanChangeIsPresented = true; } MasterDetailPage.UpdateMasterBehavior(); }
public override void WillRotate(UIInterfaceOrientation toInterfaceOrientation, double duration) { // I tested this code on iOS9+ and it's never called if (!System.Maui.Maui.IsiOS9OrNewer) { if (!MasterDetailPage.ShouldShowSplitMode && IsMasterVisible) { MasterDetailPage.CanChangeIsPresented = true; PreferredDisplayMode = UISplitViewControllerDisplayMode.PrimaryHidden; PreferredDisplayMode = UISplitViewControllerDisplayMode.Automatic; } MasterDetailPage.UpdateMasterBehavior(); MessagingCenter.Send <IVisualElementRenderer>(this, NavigationRenderer.UpdateToolbarButtons); } base.WillRotate(toInterfaceOrientation, duration); }