Maui的学习之路(2)--Mac窗体设置

Maui的学习之路

今天是我开启Maui学习之路的第二天,我不是很高兴又能水一篇文章,我只能说这文章真好水。

话不多说,我们进入正题,昨天解决了WindowsTitleBar以及窗体大小的问题,今天同样的问题,在Mac上又要解决一遍,这真的是让我又气又恨。

有了昨天的经验,今天做Mac的开发就明智了很多,因为我知道微软肯定不会让我好过,于是我直接打开Apple官网,翻到Xcode开发指南,做好准备。

同样在做有关窗体的改动之前,你需要先注册Mac上程序的生命周期函数,找了一圈并没有AddMac这个扩展方法,于是我直接使用AddiOS这个扩展方法(我就是这么优秀,直接就能定位到关键),在OnActive回调中进行我需要的操作,

操作如下:注册生命周期函数(你也可以在重写窗口的OnCreate函数)

ec7b303d4836e1a6d0613bb82d2eabcc.png11d2596063cedcf09f7a029a0f26260a.png

第一步

需要解决MacTitleBar隐藏的问题,在Mac系统上微软选择了UIKit框架进行实现,这不同于Windows,所以我熟练的打开Apple官方文档,在Apple开发者指南首页立马就能定位到目标对象,真的是超级简单,参考文档:从用 Mac Catalyst 构建的 Mac App 中移除标题栏 - 简体中文文档 - Apple Developer[1]

7b97fcfe31ca4de4872654391c994b69.png
  • 实现步骤:

  1. 获取UIApplication下的主窗体

  2. 隐藏TitleBar

5efd183c0cb04cbf9b5d98dcde1cbedd.png
  • 代码实现:

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;})});
  • 效果如下:

f4be40db647f55a428d18dbe22591741.png

第二步

需要修改Mac应用窗体的默认大小,这真是个老大难问题,我翻遍了UIKit相关的所有资料(也许没翻全),都没看到但凡一点有关窗体大小的介绍,唯一的介绍是跟View相关(修改Frame),这对我没有鸟用(这是AppKit框架下的实现),还好我的优点就是眼睛比较好,在文档中看到了这样的信息:

fc12c39c191cb712da01261b89eaedaa.png

参考资料:UISceneSizeRestrictions | Apple Developer Documentation[2]

或许修改MinimumSizeMaximumSize可以变相实现窗口尺寸变化,于是,我尝试着修改了一下,发现当我修改MinimumSize时窗体确实发生了变化,不过这里发生一个很诡异的事情,窗体的长宽并不符合我设置的值(发现这个问题是因为我获取到屏幕的size后直接设置进去,窗体并未最大化显示),于是我查了一些资料,发现好像这里要乘以1.3才是实际值,为什么是1.3我不太清楚(有知道的小伙伴可以滴滴),因为他也不是dpi的值,总之经过这一番折腾是能解决问题了,最大化窗口就是将屏幕尺寸直接给进去即可。

d5c9ff21b44dfc1e935311b3aa166c96.png
  • 代码如下:

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);});
});
  • 效果如下(窗口最大化的演示):

468267dedf164b60c5d601622327000b.png

注意: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


本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/286609.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

Android之靠谱的Activity从底部向上弹出,finish从顶部向下消失(不黑屏)

1 、需求 要求Activity从底部向上弹出,finish从顶部向下消失(不黑屏) 2、解决办法 准备3个动画xml文件 app_bottom_in.xml <?xml version="1.0" encoding="utf-8"?> <set xmlns:android="http://schemas.android.com/apk/res/andro…

ArcGIS10.8中如何获取线状、面状数据的折点,并计算折点坐标?

如下图所示为面状要素,ArcGIS10.8中如何获取线状和面状数据的折点(起点、终点、中点、端点),并计算折点的坐标(X,Y,Z,M)? 下图所示为线状(Polyline)和面状(Polygon)要素的起点、终点和折点的示意图。

Linux命令大总结(早期学习时的笔记)

Linux命令大总结 ------------------------------------------------------------------------------------ 开机自启动命令行模式和图形模式&#xff1a; vi /etc/inittab 改3为命令行模式 改5为图形模式 开关机命令&#xff1a; 关机 init 0 shtudown -h now 重启…

[转]Cordova + Ionic in Visual Studio - 101 Tutorial [Part I]

本文转自&#xff1a;http://binarylies.ghost.io/cordova-ionic-in-visual-studio/ Hi everyone, I thought about lending a hand to all the people that are, as I have been recently, exploring Cordova and all its features for the first time. For the ones still tr…

【转】学会这13个原则写UI界面文案,用户才能秒懂

原文网址&#xff1a;http://www.niaogebiji.com/article-12011-1.html 摘要: 首先&#xff0c;在写UI文案之前&#xff0c;为了理清思路&#xff0c;要先搞清楚三个问题&#xff1a;我&#xff08;设计师&#xff09;想让用户做什么&#xff1f; – 我写文案的目的为什么要让用…

【前端就业课 第一阶段】HTML5 零基础到实战(一)基础代码结构详解

注意&#xff1a;手机&#xff08;APP&#xff09;打开&#xff0c;内容显示更佳&#xff0c;不会的私聊博主即可 想要拿代码或加入学习计划&#xff08;** 博主会监督你并且教你写文章 **&#xff09;的拉到最下面&#xff08;PC端Web打开&#xff09;加博主即可&#xff0c;目…

【框架篇】mvc、mvp、mvvm使用关系总结

MVC MVC全名是Model View Controller&#xff0c;是模型(model)&#xff0d;视图(view)&#xff0d;控制器(controller)的缩写&#xff0c;一种软件设计典范&#xff0c;用一种业务逻辑、数据、界面显示分离的方法组织代码&#xff0c;将业务逻辑聚集到一个部件里面&#xff0c…

Blazor University (26)路由 —— 通过代码导航

原文链接&#xff1a;https://blazor-university.com/routing/navigating-our-app-via-code/通过代码导航源代码[1]从 Blazor 访问浏览器导航是通过 NavigationManager 服务提供的。这可以使用 razor 文件中的 inject 或 CS 文件中的 [Inject] 属性注入到 Blazor 组件中。Navig…

Android之使用自定义华为扫描SDK扫描二维码和识别本地图片

1、需求 更具UI的设计实现扫描二维码和识别本地图片二维码功能。 zxing扫描二维码还可以,但是识别本地图片二维码功能效果太差,非常不理想,看了看多github很多zxing扩展的开源项目,识别本地图片二维码功能效果不乐观,有些甚至还有裁剪本地图片,还是不能识别,果断放弃zb…

Matlab R2016b简体中文版安装教程(附Matlab R2016b百度网盘下载地址)

下载的Matlab R2016b软件安装包(文末附有下载地址)目录如下所示: 安装过程: 1. 安装主程序R2016b_win64_dvd1.iso和R2016b_win64_dvd2.iso 由于目前大多数及其都是Win8或10系统,所以选中R2016b_win64_dvd1.iso,右键→Windows资源管理器打开。Win7系统可以安装好压软件之后…

深度学习String、StringBuffer、StringBuilder

相信String这个类是Java中使用得最频繁的类之一&#xff0c;并且又是各大公司面试喜欢问到的地方&#xff0c;今天就来和大家一起学习一下String、StringBuilder和StringBuffer这几个类&#xff0c;分析它们的异同点以及了解各个类适用的场景。下面是本文的目录大纲&#xff1a…

Leetcode之打印链接的倒数第K个节点

1 问题 打印链表倒数第K个节点值。 2 代码实现 #include<stdio.h>//定义一个Node结构体,里面包含了value值和保存了下一个Node的指针(地址) typedef struct Node {int value;Node *next; } Node;//打印链表所有的值,循环遍历一次,因为链表节点的最后一个节点肯定是…

MySQL5.5多实例编译安装——mysqld_multi

一、MySQL多实例简介 MySQL多实例&#xff0c;简单地说&#xff0c;就是在一台服务器上同时开启多个不同的服务端口&#xff08;如&#xff1a;3306、3307&#xff09;&#xff0c;同时运行多个MySQL服务进程&#xff0c;这些服务进程通过不同的socket监听来自不同的端口来提供…

【前端就业课 第一阶段】HTML5 零基础到实战(二)超链接

注意&#xff1a;手机&#xff08;APP&#xff09;打开&#xff0c;内容显示更佳&#xff0c;不会的私聊博主即可 想要拿代码或加入学习计划&#xff08;** 博主会监督你并且教你写文章 **&#xff09;的拉到最下面&#xff08;PC端Web打开&#xff09;加博主即可&#xff0c;目…

架构,框架,模式,模块、组件、插件的含义和区别

架构、框架、模式、模块、组件、插件、控件、中间件的含义和区别。经常看到这些概念&#xff0c;但是有些含糊&#xff0c;花点儿功夫整理一下&#xff0c;结果还是有些地方理解的不透彻&#xff0c;先将整理的内容写下来&#xff0c;以供交流。左侧英文栏中有些单词被分成了两…

C语言,C#语言求100-999内的水仙花数源程序

水仙花数&#xff08;Narcissistic number&#xff09;也被称为超完全数字不变数&#xff08;pluperfect digital invariant, PPDI&#xff09;、自恋数、自幂数、阿姆斯壮数或阿姆斯特朗数&#xff08;Armstrong number&#xff09;&#xff0c;水仙花数是指一个 3 位数&#…

一个精简的C#表达式执行框架Dynamic Expresso

一、简介Dynamic Expresso是一个用.NET Standard 2.0编写的简单c#语句的解释器。Dynamic Expresso嵌入了自己的解析逻辑&#xff0c;通过将其转换为.NET lambda表达式或委托来解释c#语句。使用Dynamic Expresso开发人员可以创建可编写脚本的应用程序&#xff0c;无需编译即可执…

算法马拉松13 A-E解题报告

A题意&#xff08;取余最长路&#xff09;: 佳佳有一个n*m的带权矩阵&#xff0c;她想从(1,1)出发走到(n,m)且只能往右往下移动&#xff0c;她能得到的娱乐值为所经过的位置的权的总和。 有一天&#xff0c;她被下了恶毒的诅咒&#xff0c;这个诅咒的作用是将她的娱乐值变为对p…

Modis数据处理工具:MRT百度网盘下载和手把手图文安装教程

如下图所示为 MODIS Reprojection Tool(MRT)的软界面,看似简单,却是Modis遥感影像必不可少的处理工具,如投影变换等。本文以图文并茂的形式,详细讲解MRT软件在Windows10平台上的安装过程,并附MRT软件百度网盘下载地址。 Modis Tool主界面: 一、安装过程 1、安装Jav…

Word中如何设置图片与段落的间距为半行

第一种&#xff1a; 正文为5号&#xff0c;那么图片或者Viso对象前后空一行&#xff0c;设置字号为7号或者更小&#xff0c;这样设置的间距就是那个7号字的间距&#xff0c;比5号小&#xff0c;看着空白不是那么大。 第二种&#xff1a; Visio对象转为jpg&#xff0c;然后选中图…