Maui學習之路(2)-Mac視窗設定

Maui學習之路(2)-Mac視窗設定

發現微軟官網的`UIKit`官方文件竟然比`Apple`提供的還要全面

最後更新 2022/6/2 下午9:21
轩研 WPF开发者
預計閱讀 5 分鐘
分類
MAUI
標籤
.NET MAUI

今天是我開啟 Maui 學習之路的第二天,我不是很開心又能水一篇文章,我只能說這文章真好水。

話不多說,我們進入正題,昨天解決了 WindowsTitleBar 以及窗體大小的問題,今天同樣的問題,在 Mac 上又要解決一遍,這真的是讓我又氣又恨。

有了昨天的經驗,今天做 Mac 的開發就明智了很多,因為我知道微軟肯定不會讓我好過,於是我直接打開 Apple 官網,翻到 Xcode 開發指南,做好準備。

同樣在進行有關窗體的改動之前,你需要先註冊 Mac 上程式的生命週期函式,找了一圈並沒有 AddMac 這個擴充方法,於是我直接使用 AddiOS 這個擴充方法(我就是這麼優秀,直接就能定位到關鍵),在 OnActive 回呼中進行我需要的操作,

操作如下:

註冊生命週期函式(你也可以在重寫視窗的 OnCreate 函式)

第一步

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

  • 實作步驟:
  1. 獲取 UIApplication 下的主窗體

  2. 隱藏 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

或許修改 MinimumSizeMaximumSize 可以變相實現視窗尺寸變化,於是,我嘗試著修改了一下,發現當我修改 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

最後還得是我軟,巨硬真牛。

繼續探索

延伸閱讀

更多文章
同分類 / 同標籤 2023/1/12

Maui Blazor 使用攝影機實現

由於 Maui Blazor 中界面是由 WebView 渲染,所以在使用 Android 的攝影機時無法獲取,因為原生的攝影機需要綁定界面元件

繼續閱讀