Maui学習の道(2)-Macウィンドウ設定

Maui学習の道(2)-Macウィンドウ設定

マイクロソフト公式サイトの`UIKit`公式ドキュメントが、`Apple`が提供するものよりもはるかに充実していることに気づいた

最終更新 2022/06/02 21:21
轩研 WPF开发者
読了目安 3 分
カテゴリ
MAUI
タグ
.NET MAUI

今日はMaui学習の2日目です。また記事を書けて嬉しくないですが、本当に書きやすいです。

さて、本題に入ります。昨日はWindowsTitleBarとウィンドウサイズの問題を解決しましたが、今日は同じ問題をMacでも解決しないといけません。本当に腹が立ちます。

昨日の経験を活かして、今日はMac開発について賢くなりました。Microsoftが楽をさせてくれないことは分かっていたので、Appleの公式サイトを開いてXcode開発ガイドを読みました。

ウィンドウ変更を行う前に、まずMac上のプログラムのライフサイクル関数を登録する必要があります。AddMacという拡張メソッドは見つからなかったので、AddiOS拡張メソッドを直接使いました(私は優秀なので、すぐに重要なポイントにたどり着けます)。OnActiveコールバック内で必要な操作を行います。

手順は以下の通りです。

ライフサイクル関数の登録(ウィンドウのOnCreate関数をオーバーライドすることもできます)

ステップ1

Mac上のTitleBarを非表示にする問題を解決します。Macシステムでは、MicrosoftはUIKitフレームワークを選択して実装しています。これはWindowsとは異なります。そこで、Appleの公式ドキュメントを開き、Appleデベロッパガイドのトップページからすぐに目的のオブジェクトを見つけました。本当に簡単です。参考ドキュメント:Mac CatalystでビルドしたMac Appからタイトルバーを削除する

  • 実装手順:
  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;
    })
});
  • 結果は以下の通り:

ステップ2

Macアプリケーションのウィンドウのデフォルトサイズを変更する必要があります。これは非常に厄介な問題です。UIKit関連の資料をすべて調べましたが(すべてではないかもしれません)、ウィンドウサイズに関する説明はほとんどありません。唯一の説明はView関連(Frameの変更)で、これは役に立ちません(これはAppKitフレームワークでの実装です)。幸い、私の目は良いので、ドキュメントで次の情報を見つけました。

参考資料:UISceneSizeRestrictions | Apple Developer Documentation

MinimumSizeMaximumSizeを変更することで、間接的にウィンドウサイズを変更できるかもしれません。そこで試してみたところ、MinimumSizeを変更するとウィンドウのサイズが確かに変わりました。ただし、非常に奇妙なことが起こりました。設定した値と実際のウィンドウの幅と高さが一致しなかったのです(この問題に気づいたのは、画面のサイズを取得してそのまま設定したにもかかわらず、ウィンドウが最大化されなかったからです)。そこでいくつかの資料を調べたところ、ここでは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の公式ドキュメントは情報を隠しすぎていると文句を言いたくなります。Microsoftの開発ドキュメントを第2位とすると、第1位はないでしょう。Windows APIを探すときはMSDNにアクセスすれば山ほど見つかりますが、Apple公式でMacOS APIをどう検索すればいいのか本当にわかりません。

Xamarin.Macの公式ドキュメントを見てみましたが、当時Xamarin.MacAppkitの方式で実装されていたため、参考になるかは微妙です。

しかし、驚いたことに、Microsoftの公式サイトにあるUIKitのドキュメントがAppleのものよりも充実していることに気づきました。本当に嬉しい限りです。参考資料:UIKit Namespace | Microsoft Docs

結局、やっぱりMicrosoftはすごい。巨硬(Microsoft)は本当にすごいです。

さらに探索

関連読書

その他の記事
同じカテゴリ / 同じタグ 2023/01/12

Maui Blazor でカメラ機能を実装する方法

Maui Blazor ではインターフェースが WebView でレンダリングされるため、Android のカメラを使用する際に画面コンポーネントにバインドする必要があるため、カメラを取得できません。

続きを読む