Maui的學習之路
今天是我開啟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[1]

實現步驟:
獲取
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[2]
或許修改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[3]
最后還得是我軟,巨硬真牛。
參考資料
[1]
參考文檔:從用 Mac Catalyst 構建的 Mac App 中移除標題欄 - 簡體中文文檔 - Apple Developer: 鏈接:https://developer.apple.com/cn/documentation/uikit/mac_catalyst/removing_the_title_bar_in_your_mac_app_built_with_mac_catalyst/
[2]參考資料:UISceneSizeRestrictions | Apple Developer Documentation: https://developer.apple.com/documentation/uikit/uiscenesizerestrictions
[3]參考資料:UIKit Namespace | Microsoft Docs: https://docs.microsoft.com/zh-cn/dotnet/api/uikit?view=xamarin-ios-sdk-12