Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Translucent and Transparent NavigationBar on iOS #19204

Merged
merged 27 commits into from Jan 24, 2024
Merged
Show file tree
Hide file tree
Changes from 26 commits
Commits
Show all changes
27 commits
Select commit Hold shift + click to select a range
39aadae
Changes for enabling translucent navigation bar ios
tj-devel709 Nov 7, 2023
80e96de
Add UITest for NavigationPage Safe Area Translucence
tj-devel709 Dec 5, 2023
1f8d1e1
remove UIKit
tj-devel709 Dec 13, 2023
4a6e808
Move UITest from gallery to Issues
tj-devel709 Dec 13, 2023
a1b4ad9
push a new page for UITests, consolidate code, and save shadowimage
tj-devel709 Dec 14, 2023
8316933
Changes for enabling translucent navigation bar ios
tj-devel709 Nov 7, 2023
6461ed6
Add UITest for NavigationPage Safe Area Translucence
tj-devel709 Dec 5, 2023
39c8baa
remove UIKit
tj-devel709 Dec 13, 2023
689ee1a
Move UITest from gallery to Issues
tj-devel709 Dec 13, 2023
9c2d7da
make the extension method
tj-devel709 Dec 16, 2023
3604525
use the background color alpha for translucent
tj-devel709 Jan 17, 2024
f7c7fe5
use same alpha logic for pre ios 15
tj-devel709 Jan 17, 2024
59e7a70
accidently added testing comments
tj-devel709 Jan 17, 2024
2328222
add more UITests for the different NavigationPage and Flyout Page sce…
tj-devel709 Jan 18, 2024
07e70b4
use additionalsafeareainsets for the secondary toolbar
tj-devel709 Jan 19, 2024
f80cbc7
missing new line
tj-devel709 Jan 19, 2024
cc6853b
only run the secondary toolbar offset when we have a secondary toolbar
tj-devel709 Jan 19, 2024
b5ee2e0
use existing childViewControllers
tj-devel709 Jan 19, 2024
c4a1d8b
remove the shadow stuff and simplify the expression with null
tj-devel709 Jan 22, 2024
dd739f8
style and fixes from merge conflicts
tj-devel709 Jan 22, 2024
cae76b8
standardAppearance and scrolledgeappearance should be kept in
tj-devel709 Jan 22, 2024
b106aa5
changes after talking with Shane
tj-devel709 Jan 23, 2024
d2922d4
change shell behavior to be more like navrenderer with preiOS13
tj-devel709 Jan 23, 2024
b6821b2
move code if we are transparent pre13 shell
tj-devel709 Jan 23, 2024
0f5f356
remove new lines
tj-devel709 Jan 23, 2024
8f37f6d
add screenshot tests
tj-devel709 Jan 24, 2024
7af6627
be able to remove and add secondarybar additionalsafeareas
tj-devel709 Jan 24, 2024
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Jump to
Jump to file
Failed to load files.
Diff view
Diff view
@@ -0,0 +1,31 @@
<?xml version="1.0" encoding="utf-8" ?>
<ContentPage xmlns="http://schemas.microsoft.com/dotnet/2021/maui"
xmlns:x="http://schemas.microsoft.com/winfx/2009/xaml"
AutomationId="NavBarTranslucentPage"
x:Class="Maui.Controls.Sample.Issues.Issue17022"
xmlns:ios="clr-namespace:Microsoft.Maui.Controls.PlatformConfiguration.iOSSpecific;assembly=Microsoft.Maui.Controls">
<VerticalStackLayout>
<Button FontSize="12" Text="Push NavigationPage" AutomationId="NewNavigationPageButton" Clicked="NewNavigationPagePressed"/>
<Button FontSize="12" Text="Push NavigationPage (transparent)" AutomationId="NewNavigationPageTransparentButton" Clicked="NewNavigationPageTransparentPressed"/>
<Button FontSize="12" Text="Push NavigationPage (translucent)" AutomationId="NewNavigationPageTranslucentButton" Clicked="NewNavigationPageTranslucentPressed"/>
<Button FontSize="12" Text="Push NavigationPage (transparent and translucent)" AutomationId="NewNavigationPageTransparentTranslucentButton" Clicked="NewNavigationPageTransparentTranslucentPressed"/>
<Button FontSize="12" Text="Push NavigationPage (grid SA)" AutomationId="NewNavigationPageGridButton" Clicked="NewNavigationPageGridPressed"/>
<Button FontSize="12" Text="Push NavigationPage (transparent and grid SA)" AutomationId="NewNavigationPageGridTransparentButton" Clicked="NewNavigationPageGridTransparentPressed"/>
<Button FontSize="12" Text="Push NavigationPage (translucent and grid SA)" AutomationId="NewNavigationPageGridTranslucentButton" Clicked="NewNavigationPageGridTranslucentPressed"/>
<Button FontSize="12" Text="Push NavigationPage (transparent, translucent, and grid SA)" AutomationId="NewNavigationPageGridTransparentTranslucentButton" Clicked="NewNavigationPageGridTransparentTranslucentPressed"/>

<Button FontSize="12" Text="Push FlyoutPage" AutomationId="NewFlyoutPageButton" Clicked="NewFlyoutPagePressed"/>
<Button FontSize="12" Text="Push FlyoutPage (transparent)" AutomationId="NewFlyoutPageTransparentButton" Clicked="NewFlyoutPageTransparentPressed"/>
<Button FontSize="12" Text="Push FlyoutPage (translucent)" AutomationId="NewFlyoutPageTranslucentButton" Clicked="NewFlyoutPageTranslucentPressed"/>
<Button FontSize="12" Text="Push FlyoutPage (transparent and translucent)" AutomationId="NewFlyoutPageTransparentTranslucentButton" Clicked="NewFlyoutPageTransparentTranslucentPressed"/>
<Button FontSize="12" Text="Push FlyoutPage (grid SA)" AutomationId="NewFlyoutPageGridButton" Clicked="NewFlyoutPageGridPressed"/>
<Button FontSize="12" Text="Push FlyoutPage (transparent and grid SA)" AutomationId="NewFlyoutPageGridTransparentButton" Clicked="NewFlyoutPageGridTransparentPressed"/>
<Button FontSize="12" Text="Push FlyoutPage (translucent and grid SA)" AutomationId="NewFlyoutPageGridTranslucentButton" Clicked="NewFlyoutPageGridTranslucentPressed"/>
<Button FontSize="12" Text="Push FlyoutPage (transparent, translucent, and grid SA)" AutomationId="NewFlyoutPageGridTransparentTranslucentButton" Clicked="NewFlyoutPageGridTransparentTranslucentPressed"/>

<Button FontSize="12" Text="Push Semi-Transparent NavigationPage BackgroundColor" AutomationId="SemiTransparentNavigationPageBackgroundColor" Clicked="SemiTransparentNavigationPageBackgroundColorPressed"/>
<Button FontSize="12" Text="Push Semi-Transparent NavigationPage Brush" AutomationId="SemiTransparentNavigationPageBrush" Clicked="SemiTransparentNavigationPageBrushPressed"/>
<Button FontSize="12" Text="Push Semi-Transparent FlyoutPage BackgroundColor" AutomationId="SemiTransparentFlyoutPageBackgroundColor" Clicked="SemiTransparentFlyoutPageBackgroundColorPressed"/>
<Button FontSize="12" Text="Push Semi-Transparent FlyoutPage Brush" AutomationId="SemiTransparentFlyoutPageBrush" Clicked="SemiTransparentFlyoutPageBrushPressed"/>
</VerticalStackLayout>
</ContentPage>
@@ -0,0 +1,274 @@
using Microsoft.Maui.Controls;
using Microsoft.Maui.Controls.Xaml;
using Microsoft.Maui.Graphics;
using Microsoft.Maui.Controls.PlatformConfiguration;
using Microsoft.Maui.Controls.PlatformConfiguration.iOSSpecific;
using NavigationPage = Microsoft.Maui.Controls.NavigationPage;
using FlyoutPage = Microsoft.Maui.Controls.FlyoutPage;

namespace Maui.Controls.Sample.Issues;

[XamlCompilation(XamlCompilationOptions.Compile)]
[Issue(IssueTracker.Github, 17022, "UINavigationBar is Translucent", PlatformAffected.iOS)]
public partial class Issue17022 : ContentPage
{
public Issue17022()
{
InitializeComponent();
}

readonly string _topOfScreenText = "Green boxview should be behind navbar and touching very top of screen.";
readonly string _notTopOfScreenText = "Green boxview should NOT be behind navbar and NOT touching very top of screen.";

async void NewNavigationPagePressed(System.Object sender, System.EventArgs e)
{
var mainPage = CreateMainPage(true, _notTopOfScreenText);
var navPage = new NavigationPage(mainPage);
await Navigation.PushModalAsync(navPage);
}

async void NewNavigationPageTransparentPressed(System.Object sender, System.EventArgs e)
{
var mainPage = CreateMainPage(true, _notTopOfScreenText);
var navPage = new NavigationPage(mainPage)
{
BarBackgroundColor = Colors.Transparent,
};
await Navigation.PushModalAsync(navPage);
}

async void NewNavigationPageTranslucentPressed(System.Object sender, System.EventArgs e)
{
var mainPage = CreateMainPage(true, _notTopOfScreenText);
var navPage = new NavigationPage(mainPage);
navPage.On<iOS>().EnableTranslucentNavigationBar();
await Navigation.PushModalAsync(navPage);
}

async void NewNavigationPageTransparentTranslucentPressed(System.Object sender, System.EventArgs e)
{
var mainPage = CreateMainPage(true, _notTopOfScreenText);
var navPage = new NavigationPage(mainPage)
{
BarBackgroundColor = Colors.Transparent,
};
navPage.On<iOS>().EnableTranslucentNavigationBar();
await Navigation.PushModalAsync(navPage);
}

async void NewNavigationPageGridPressed(System.Object sender, System.EventArgs e)
{
var mainPage = CreateMainPage(false, _notTopOfScreenText);
var navPage = new NavigationPage(mainPage);
await Navigation.PushModalAsync(navPage);
}

async void NewNavigationPageGridTransparentPressed(System.Object sender, System.EventArgs e)
{
var mainPage = CreateMainPage(false, _notTopOfScreenText);
var navPage = new NavigationPage(mainPage)
{
BarBackgroundColor = Colors.Transparent,
};
await Navigation.PushModalAsync(navPage);
}

async void NewNavigationPageGridTranslucentPressed(System.Object sender, System.EventArgs e)
{
var mainPage = CreateMainPage(false, _notTopOfScreenText);
var navPage = new NavigationPage(mainPage);
navPage.On<iOS>().EnableTranslucentNavigationBar();
await Navigation.PushModalAsync(navPage);
}

async void NewNavigationPageGridTransparentTranslucentPressed(System.Object sender, System.EventArgs e)
{
var mainPage = CreateMainPage(false, _topOfScreenText);
var navPage = new NavigationPage(mainPage)
{
BarBackgroundColor = Colors.Transparent,
};
navPage.On<iOS>().EnableTranslucentNavigationBar();
await Navigation.PushModalAsync(navPage);
}

async void NewFlyoutPagePressed(System.Object sender, System.EventArgs e)
{
var detail = new NavigationPage(CreateMainPage(true, _notTopOfScreenText));
var flyoutPage = new FlyoutPage()
{
Flyout = new ContentPage(){Title = "FlyoutPage"},
Detail = detail
};
detail.BarBackgroundColor = Colors.Transparent;
detail.On<iOS>().SetHideNavigationBarSeparator(true);
detail.On<iOS>().EnableTranslucentNavigationBar();
await Navigation.PushModalAsync(flyoutPage);
}

async void NewFlyoutPageTransparentPressed(System.Object sender, System.EventArgs e)
{
var detail = new NavigationPage(CreateMainPage(true, _notTopOfScreenText));
var flyoutPage = new FlyoutPage()
{
Flyout = new ContentPage(){Title = "FlyoutPage"},
Detail = detail
};
detail.BarBackgroundColor = Colors.Transparent;
await Navigation.PushModalAsync(flyoutPage);
}

async void NewFlyoutPageTranslucentPressed(System.Object sender, System.EventArgs e)
{
var detail = new NavigationPage(CreateMainPage(true, _notTopOfScreenText));
var flyoutPage = new FlyoutPage()
{
Flyout = new ContentPage(){Title = "FlyoutPage"},
Detail = detail
};
detail.On<iOS>().EnableTranslucentNavigationBar();
await Navigation.PushModalAsync(flyoutPage);
}

async void NewFlyoutPageTransparentTranslucentPressed(System.Object sender, System.EventArgs e)
{
var detail = new NavigationPage(CreateMainPage(true, _notTopOfScreenText));
var flyoutPage = new FlyoutPage()
{
Flyout = new ContentPage(){Title = "FlyoutPage"},
Detail = detail
};
detail.BarBackgroundColor = Colors.Transparent;
detail.On<iOS>().EnableTranslucentNavigationBar();
await Navigation.PushModalAsync(flyoutPage);
}

async void NewFlyoutPageGridPressed(System.Object sender, System.EventArgs e)
{
var detail = new NavigationPage(CreateMainPage(false, _notTopOfScreenText));
var flyoutPage = new FlyoutPage()
{
Flyout = new ContentPage(){Title = "FlyoutPage"},
Detail = detail
};
await Navigation.PushModalAsync(flyoutPage);
}

async void NewFlyoutPageGridTransparentPressed(System.Object sender, System.EventArgs e)
{
var detail = new NavigationPage(CreateMainPage(false, _notTopOfScreenText));
var flyoutPage = new FlyoutPage()
{
Flyout = new ContentPage(){Title = "FlyoutPage"},
Detail = detail
};
detail.BarBackgroundColor = Colors.Transparent;
await Navigation.PushModalAsync(flyoutPage);
}

async void NewFlyoutPageGridTranslucentPressed(System.Object sender, System.EventArgs e)
{
var detail = new NavigationPage(CreateMainPage(false, _notTopOfScreenText));
var flyoutPage = new FlyoutPage()
{
Flyout = new ContentPage(){Title = "FlyoutPage"},
Detail = detail
};
detail.On<iOS>().EnableTranslucentNavigationBar();
await Navigation.PushModalAsync(flyoutPage);
}
async void NewFlyoutPageGridTransparentTranslucentPressed(System.Object sender, System.EventArgs e)
{
var detail = new NavigationPage(CreateMainPage(false, _topOfScreenText));
var flyoutPage = new FlyoutPage()
{
Flyout = new ContentPage(){Title = "FlyoutPage"},
Detail = detail
};
detail.BarBackgroundColor = Colors.Transparent;
detail.On<iOS>().EnableTranslucentNavigationBar();
await Navigation.PushModalAsync(flyoutPage);
}

async void SemiTransparentNavigationPageBackgroundColorPressed(System.Object sender, System.EventArgs e)
{
var mainPage = CreateMainPage(false, _topOfScreenText);
var navPage = new NavigationPage(mainPage)
{
BarBackgroundColor = Color.FromRgba(100, 100, 100, 50),
};
navPage.On<iOS>().EnableTranslucentNavigationBar();
await Navigation.PushModalAsync(navPage);
}

async void SemiTransparentNavigationPageBrushPressed(System.Object sender, System.EventArgs e)
{
var mainPage = CreateMainPage(false, _topOfScreenText);
var navPage = new NavigationPage(mainPage)
{
BarBackground = Color.FromRgba(100, 100, 100, 50),
};
navPage.On<iOS>().EnableTranslucentNavigationBar();
await Navigation.PushModalAsync(navPage);
}

async void SemiTransparentFlyoutPageBackgroundColorPressed(System.Object sender, System.EventArgs e)
{
var detail = new NavigationPage(CreateMainPage(false, _topOfScreenText));
var flyoutPage = new FlyoutPage()
{
Flyout = new ContentPage(){Title = "FlyoutPage"},
Detail = detail
};
detail.BarBackgroundColor = Color.FromRgba(100, 100, 100, 50);
detail.On<iOS>().EnableTranslucentNavigationBar();
await Navigation.PushModalAsync(flyoutPage);
}

async void SemiTransparentFlyoutPageBrushPressed(System.Object sender, System.EventArgs e)
{
var detail = new NavigationPage(CreateMainPage(false, _topOfScreenText));
var flyoutPage = new FlyoutPage()
{
Flyout = new ContentPage(){Title = "FlyoutPage"},
Detail = detail
};
detail.BarBackground = Color.FromRgba(100, 100, 100, 50);
detail.On<iOS>().EnableTranslucentNavigationBar();
await Navigation.PushModalAsync(flyoutPage);
}

ContentPage CreateMainPage (bool useSafeArea, string expectedText)
{
var mainPage = new ContentPage(){
AutomationId="PopupMainPage"
};
var grid = new Grid
{
RowDefinitions =
{
new RowDefinition { Height = new Microsoft.Maui.GridLength(1, Microsoft.Maui.GridUnitType.Star) },
new RowDefinition { Height = new Microsoft.Maui.GridLength(1, Microsoft.Maui.GridUnitType.Star) },
new RowDefinition { Height = new Microsoft.Maui.GridLength(1, Microsoft.Maui.GridUnitType.Star) },
},
};

var button = new Button { Text = "Pop Page", AutomationId="PopPageButton" };
button.Clicked += PopModalButtonClicked;

grid.Add (new BoxView { BackgroundColor = Colors.Green, AutomationId="TopBoxView" }, 0, 0 );
grid.Add (new Label { TextColor = Colors.Black, Margin= new Microsoft.Maui.Thickness(0,60,0,0), HorizontalTextAlignment = Microsoft.Maui.TextAlignment.Center, Text="Can you see me?" }, 0, 0 );
grid.Add (new Label { Text = expectedText }, 0, 1 );
grid.Add (button, 0, 2 );
grid.IgnoreSafeArea = true;

mainPage.Content = grid;
mainPage.On<iOS>().SetUseSafeArea(useSafeArea);
return mainPage;
}

async void PopModalButtonClicked (System.Object sender, System.EventArgs e)
{
await Navigation.PopModalAsync();
}
}