今天是我開啟 Maui 學習之路的第二天,我不是很開心又能水一篇文章,我只能說這文章真好水。
話不多說,我們進入正題,昨天解決了 Windows 下 TitleBar 以及窗體大小的問題,今天同樣的問題,在 Mac 上又要解決一遍,這真的是讓我又氣又恨。
有了昨天的經驗,今天做 Mac 的開發就明智了很多,因為我知道微軟肯定不會讓我好過,於是我直接打開 Apple 官網,翻到 Xcode 開發指南,做好準備。
同樣在進行有關窗體的改動之前,你需要先註冊 Mac 上程式的生命週期函式,找了一圈並沒有 AddMac 這個擴充方法,於是我直接使用 AddiOS 這個擴充方法(我就是這麼優秀,直接就能定位到關鍵),在 OnActive 回呼中進行我需要的操作,
操作如下:
註冊生命週期函式(你也可以在重寫視窗的 OnCreate 函式)


第一步
需要解決 Mac 上 TitleBar 隱藏的問題,在 Mac 系統上微軟選擇了 UIKit 框架進行實現,這不同於 Windows,所以我熟練的打開 Apple 官方文件,在 Apple 開發者指南首頁立馬就能定位到目標物件,真的是超級簡單,參考文件:從用 Mac Catalyst 構建的 Mac App 中移除標題列 - 簡體中文文件 - Apple Developer

- 實作步驟:
獲取
UIApplication下的主窗體隱藏
TitleBar

- 程式碼實現:
builder.AddiOS(app =>
{
app.OnActivated(e =>
{
//var vKeyWindow = e.KeyWindow;
var vKeyWindow = e.Windows.FirstOrDefault();
if (vKeyWindow is null)
return;
var vTitleBar = vKeyWindow.WindowScene?.Titlebar;
if (vTitleBar is null)
return;
vTitleBar.TitleVisibility = UITitlebarTitleVisibility.Hidden;
vTitleBar.Toolbar = null;
})
});
- 效果如下:

第二步
需要修改 Mac 應用窗體的預設大小,這真是個老大難問題,我翻遍了 UIKit 相關的所有資料(也許沒翻全),都沒看到但凡一點有關窗體大小的介紹,唯一的介紹是跟 View 相關(修改 Frame),這對我沒有鳥用(這是 AppKit 框架下的實現),還好我的優點就是眼睛比較好,在文件中看到了這樣的資訊:

參考資料:UISceneSizeRestrictions | Apple Developer Documentation
或許修改 MinimumSize 和 MaximumSize 可以變相實現視窗尺寸變化,於是,我嘗試著修改了一下,發現當我修改 MinimumSize 時窗體確實發生了變化,不過這裡發生一個很詭異的事情,窗體的長寬並不符合我設定的值(發現這個問題是因為我獲取到螢幕的 size 後直接設定進去,窗體並未最大化顯示),於是我查了一些資料,發現好像這裡要乘以 1.3 才是實際值,為什麼是 1.3 我不太清楚(有知道的小夥伴可以滴滴),因為他也不是 dpi 的值,總之經過這一番折騰是能解決問題了,最大化視窗就是將螢幕尺寸直接給進去即可。

- 程式碼如下:
builder.AddiOS(app =>
{
app.OnActivated(e =>
{
//var vKeyWindow = e.KeyWindow;
var vKeyWindow = e.Windows.FirstOrDefault();
if (vKeyWindow is null)
return;
var vTitleBar = vKeyWindow.WindowScene?.Titlebar;
if (vTitleBar is null)
return;
vTitleBar.TitleVisibility = UITitlebarTitleVisibility.Hidden;
vTitleBar.Toolbar = null;
double nWidth = 1000;
double nHeight = 500;
var vScreen = vKeyWindow.Screen;
var vCGRect = vScreen.Bounds;
if (nWidth > vCGRect.Width)
nWidth = vCGRect.Width.Value;
if (nHeight > vCGRect.Height)
nHeight = vCGRect.Height.Value;
vKeyWindow.WindowScene.SizeRestrictions.MinimumSize = new CGSize(nWidth * 1.3, nHeight);
vKeyWindow.WindowScene.SizeRestrictions.MaximumSize = new CGSize(vCGRect.Width * 1.3, vCGRect.Height * 1.3);
});
});
- 效果如下(視窗最大化的演示):

注意:Apple的程式每次執行後會記住上一次啟動視窗的大小,所以 當你首次將介面改大後使用上述的方式並不能將他改小,此時你需要將MaximumSize改小才能讓視窗變小。
最終我並未找到怎麼開啟 Mac 程式的全螢幕方案,很抱歉(如果有知道 UIKit 怎麼全螢幕的朋友歡迎滴滴)。
另外不得不吐槽一點,Apple 官方文件太能藏了,微軟的開發文件如果是第二那麼沒人敢說第一,如果我要找 Windows API 我只需要進到 MSDN 一搜一大把,但是說真的我都不知道怎麼在蘋果官方搜 MacOS API。
我翻了一下 Xamarin.Mac 官方文件,當初 Xamarin.Mac 使用的是 Appkit 的那套方案實現的,所以好像參考性不是特別大。
不過新奇的我居然發現微軟官網的 UIKit 官方文件居然比 Apple 提供的還要全面,真是讓人欣喜若狂,參考資料:UIKit Namespace | Microsoft Docs
最後還得是我軟,巨硬真牛。