当前位置: 首页 > news >正文

SwiftUI实现iPad多任务分屏

1. 概述

iPadOS引入了多任务分屏功能,使用户能够同时在一个屏幕上使用多个应用程序。这为用户提供了更高效的工作环境,可以在同一时间处理多个任务。

iPad多任务分屏有两种常见的模式:1/2分屏和Slide Over(滑动覆盖)。1/2分屏将屏幕均分为两个应用程序,而Slide Over模式则允许一个应用程序以较窄的宽度覆盖在另一个应用程序上方。

2. 配置App项目以支持多任务

要使你的App项目支持多任务分屏,需要进行以下配置,在app info文件中:

  1. 不能配置`Requires Full Screen`,或者配置为NO。

  2. 配置`Supported interface orientations (iPad)`支持4个方向。

  3. 配置`Application Scene Manifest`项,并将其下的`Enable Multiple Windows`设置为`yes`。

这样,你的App就会被配置为支持多任务分屏。

3. 屏幕区分和获取屏幕size


在SwiftUI中,你可以使用@Environment属性包装器来获取屏幕的大小。以下是一个示例代码:

import SwiftUIstruct ContentView: View {@Environment(\.horizontalSizeClass) var horizontalSizeClassvar body: some View {if horizontalSizeClass == .compact {// ...} else {// ...}}
}

在上面的代码中,我们使用`@Environment(\.horizontalSizeClass) varhorizontalSizeClass`来获取水平尺寸类别,具体如下:

  • 当iPad横屏时:
  1. app全屏或者占屏幕宽度2/3时,为regular。
  2. app占屏幕宽度1/3或者1/2时,为compact。
  • 当iPad竖屏时:
  1. app全屏幕宽度时,为regular。
  2. app非全屏幕宽度时,为compact。

那么如何获取到分屏后的App屏幕宽度呢?就需要用到下面这个组件了。

GeometryReader

将GeometryReader包裹在组件的外部,在屏幕变化是即可得到分屏后的宽度。如下面示例代码:

var body: some View {GeometryReader { geometry inVStack {Spacer()if horizontalSizeClass == .compact {VStack(alignment: .center, spacing: 20) {Image(systemName: "globe").imageScale(.large).foregroundColor(.accentColor)Text("horizontalSizeClass == compact")Text("当前App屏幕宽度为:\(geometry.size.width)")}.padding().frame(width: geometry.size.width)} else {HStack(alignment: .center, spacing: 20) {Image(systemName: "globe").imageScale(.large).foregroundColor(.accentColor)Text("horizontalSizeClass == regular")Text("当前App屏幕宽度为:\(geometry.size.width)")}.padding().frame(width: geometry.size.width)}Spacer()}}}

运行结果如下:

  

  

       

这种判断类型还是不够严谨,比如横屏是的1/3或者1/2分屏,都是compact,1/3时我们可以使用iPhone的布局,但是1/2时也使用iPhone的布局的话,界面元素的尺寸会很大,显示内容比较少。为了解决这个问题,下面提供了一个新的方法,来将分屏后的类型进行细分:

calculateSplitRatio方法

enum SplitRatio {case fullScreencase halfcase oneThirdcase twoThirds
}func calculateSplitRatio(width: CGFloat) -> SplitRatio {let screenWidth = UIScreen.main.bounds.widthlet screenHeight = UIScreen.main.bounds.heightif abs(width - screenWidth) <= 10 {return .fullScreen}if screenWidth > screenHeight {let halfWidth = screenWidth / 2let oneThirdWidth = screenWidth / 3let twoThirdsWidth = oneThirdWidth * 2let diffToHalf = abs(width - halfWidth)let diffToOneThird = abs(width - oneThirdWidth)let diffToTwoThirds = abs(width - twoThirdsWidth)if diffToHalf <= diffToOneThird && diffToHalf <= diffToTwoThirds {return .half} else if diffToOneThird <= diffToHalf && diffToOneThird <= diffToTwoThirds {return .oneThird} else {return .twoThirds}} else {let halfWidth = screenWidth / 2if width > halfWidth {return .half} else {return .oneThird}}}

上面的代码中定义了`SplitRatio`枚举 ,包含了4中类型。在calculateSplitRatio方法中,我们只需要传入分屏后的宽度即可。

这里需要重点说一下的是在iPad竖屏分屏时,如果分屏线在左侧,则认为左侧宽度为1/3,右侧为1/2,如果分屏线在右侧,则左侧宽度为1/2,右侧1/3.这样做,我们能在代码上更好的布局。示例代码如下:

var body: some View {GeometryReader { geometry inlet splitRatio = calculateSplitRatio(width: geometry.size.width)VStack {if splitRatio == .oneThird {} else if splitRatio == .half {} else if splitRatio == .twoThirds {} else {}}.background(Color.cyan)}}

4. SwiftUI代码注意事项

在编写SwiftUI代码时,有一些注意事项需要考虑:

  1. 使用适当的布局容器:SwiftUI提供了多种布局容器,如VStack、HStack和ZStack等。根据你的布局需求,选择适当的容器来组织和排列你的视图元素,尽量不使用固定的尺寸布局。
  2. 使用合适的布局修饰符:SwiftUI提供了许多布局修饰符,如padding、spacing和alignment等。使用这些修饰符可以调整视图元素之间的间距、对齐方式等,以获得所需的布局效果。
  3. 考虑不同屏幕尺寸和方向:SwiftUI可以自动适应不同的屏幕尺寸和方向。使用自适应布局和动态尺寸来确保你的界面在不同设备上都能正确显示,并且能够适应横竖屏切换。
     

如果觉得文章对你有用,不妨给个赞,关注一下,更多好用文章还在继续更新中。

本篇文章出自https://blog.csdn.net/guoyongming925的博客,如需转载,还请标明出处。

相关文章:

SwiftUI实现iPad多任务分屏

1. 概述 iPadOS引入了多任务分屏功能&#xff0c;使用户能够同时在一个屏幕上使用多个应用程序。这为用户提供了更高效的工作环境&#xff0c;可以在同一时间处理多个任务。 iPad多任务分屏有两种常见的模式&#xff1a;1/2分屏和Slide Over&#xff08;滑动覆盖&#xff09;…...

maven依赖,继承

依赖的范围 compile引入的依赖 对main目录下的代码有没有效&#xff0c;main目录下的代码能不能用compile引入的依赖中的类等 以test引入的依赖&#xff0c;在main中是否可以使用 provided&#xff08;已提供&#xff09;&#xff0c;有了就不要带到服务器上&#xff0c;打包…...

仿`gRPC`功能实现像调用本地方法一样调用其他服务器方法

文章目录 仿gRPC功能实现像调用本地方法一样调用其他服务器方法 简介单体架构微服务架构RPCgPRC gRPC交互逻辑服务端逻辑客户端逻辑示例图 原生实现仿gRPC框架编写客户端方法编写服务端方法综合演示 仿 gRPC功能实现像调用本地方法一样调用其他服务器方法 简介 在介绍gRPC简介…...

分布式环境下的数据同步

一般而言elasticsearch负责搜索&#xff08;查询&#xff09;&#xff0c;而sql数据负责记录&#xff08;增删改&#xff09;&#xff0c;elasticsearch中的数据来自于sql数据库&#xff0c;因此sql数据发生改变时&#xff0c;elasticsearch也必须跟着改变&#xff0c;这个就是…...

无涯教程-Flutter - 数据库

SQLite" class"css-1occaib">SQLite数据库是基于事实和标准SQL的嵌入式数据库引擎&#xff0c;它是小型且经过时间考验的数据库引擎&#xff0c;sqflite软件包提供了许多函数&#xff0c;可以有效地与SQLite数据库一起使用&#xff0c;它提供了操作SQLite数据…...

算法笔记:平衡二叉树

1 介绍 平衡二叉树&#xff08;AVL树&#xff09;是一种特殊的二叉搜索树&#xff08;BST&#xff09;&#xff0c;它自动确保树保持低高度&#xff0c;以便实现各种基本操作&#xff08;如添加、删除和查找&#xff09;的高效性能。 ——>时间都维持在了O(logN)它是一棵空…...

redis 通用命令

目录 通用命令是什么 SET & GET keys EXISTS DEL EXPIRE TTL redis 的过期策略 定时器策略 基于优先级队列定时器 基于时间轮的定时器 TYPE 通过 redis 客户端和 redis 服务器交互。 所以需要使用 redis 的命令&#xff0c;但是 redis 的命令非常多。 通用命令…...

Pycharm配置及使用Git教程

文章目录 1. 安装PyCharm2. 安装Git3. 在PyCharm中配置Git插件4. 连接远程Gtilab仓库5. Clone项目代码6. 将本地文件提交到远程仓库6.1 git add6.2 git commit6.3 git push6.4 git pull 平时习惯在windows下开发&#xff0c;但是我们又需要实时将远方仓库的代码clone到本地&…...

CSS transition 过渡

1 前言 水平居中、垂直居中是前端面试百问不厌的问题。 其实现方案也是多种多样&#xff0c;常叫人头昏眼花。 水平方向可以认为是内联方向&#xff0c;垂直方向认为是块级方向。 下面介绍一些常见的方法。 2 内联元素的水平垂直居中 首先&#xff0c;常见内联元素有&…...

Unity中Shader的UV扭曲效果的实现

文章目录 前言一、实现的思路1、在属性面板暴露一个 扭曲贴图的属性2、在片元结构体中&#xff0c;新增一个float2类型的变量&#xff0c;用于独立存储将用于扭曲的纹理的信息3、在顶点着色器中&#xff0c;根据需要使用TRANSFORM_TEX对Tilling 和 Offset 插值&#xff1b;以及…...

Automotive 添加一个特权APP

Automotive 添加一个特权APP platform: android-13.0.0_r32 一. 添加一个自定义空调的app为例 路径&#xff1a;packages/apps/Car/MyHvac app内容可以自己定义&#xff0c;目录结构如下&#xff1a; 1.1 Android.bp package {default_applicable_licenses: ["Andr…...

自定义TimeLine

自定义TimeLine 什么是TimeLineData&#xff08;数据&#xff09;Clip&#xff08;片段&#xff09;Track&#xff08;轨道&#xff09;Mixer&#xff08;混合&#xff09; 什么是TimeLine 在 Unity 中&#xff0c;TimeLine&#xff08;时间轴&#xff09;是一种用于创建和管理…...

如何使用SQL系列 之 如何在SQL中使用WHERE条件语句

引言 在结构化查询语言 (SQL)语句中&#xff0c;WHERE子句限制了给定操作会影响哪些行。它们通过定义特定的条件(称为搜索条件)来实现这一点&#xff0c;每一行都必须满足这些条件才能受到操作的影响。 本指南将介绍WHERE子句中使用的通用语法。它还将概述如何在单个WHERE子句…...

leetcode:1941. 检查是否所有字符出现次数相同(python3解法)

难度&#xff1a;简单 给你一个字符串 s &#xff0c;如果 s 是一个 好 字符串&#xff0c;请你返回 true &#xff0c;否则请返回 false 。 如果 s 中出现过的 所有 字符的出现次数 相同 &#xff0c;那么我们称字符串 s 是 好 字符串。 示例 1&#xff1a; 输入&#xff1a;s…...

Echarts 各种点击事件监听

目录 一、鼠标事件1.1、左击1.2、双击1.3、右击1.4、右键双击1.5、中轴滚动二、时间轴2.1、时间轴监听三、拖动3.1、拖动事件一、鼠标事件 1.1、左击 chart.on(click, function(params)...

《智能网联汽车自动驾驶功能测试规程》

一、 编制背景 2018 年4 月12 日&#xff0c;工业和信息化部、公安部、交通运输部联合发布《智能网联汽车道路测试管理规范(试行)》&#xff08;以下简称《管理规范》&#xff09;&#xff0c;对智能网联汽车道路测试申请、审核、管理以及测试主体、测试驾驶人和测试车辆要求等…...

NVIDIA CUDA Win10安装步骤

前言 windows10 版本安装 CUDA &#xff0c;首先需要下载两个安装包 CUDA toolkit&#xff08;toolkit就是指工具包&#xff09;cuDNN 1. 安装前准备 在安装CUDA之前&#xff0c;需要完成以下准备工作&#xff1a; 确认你的显卡已经正确安装&#xff0c;在设备管理器中可以看…...

Elasticsearch、Kibana以及Java操作ES 的快速使用

docker 安装elastic search 、 kibana&#xff08;可视化管理elastic search&#xff09; docker pull elasticsearch:7.12.1 docker pull kibana:7.12.1创建docker自定义网络 docker自定义网络可以使得容器之间使用容器名网络互连&#xff0c;默认的网络不会有这功能。 一定…...

逐鹿人形机器人,百度、腾讯、小米卷起来

长期不温不火的人形机器人产业迎来新风口&#xff0c;技术显著提升、新品层出不穷、资本投资态度也逐渐好转。 8月18日&#xff0c;2023世界机器人大会博览会正式开放&#xff0c;全面展示了机器人行业的新技术、新产品和新应用。据悉&#xff0c;此次展会展览总面积达4.5万平…...

AndroidStudio推荐下载和配置

1、推荐下载链接 Download Android Studio & App Tools - Android Developers 2、gradle配置案例 // Top-level build file where you can add configuration options common to all sub-projects/modules.buildscript {repositories {maven { url https://maven.aliyun.…...

城市峡谷里,你的车是怎么知道自己在哪的?聊聊INS、NHC和轮速计(ODO)的“组合拳”

城市峡谷里&#xff0c;你的车是怎么知道自己在哪的&#xff1f;聊聊INS、NHC和轮速计&#xff08;ODO&#xff09;的“组合拳” 想象一下&#xff0c;你正驾驶车辆穿梭在纽约曼哈顿的摩天大楼之间&#xff0c;或是穿越一条漫长的山体隧道。突然&#xff0c;车载导航屏幕上的定…...

如何在不同的机器上运行多个OpenClaw实例?

想让不同机器上的 OpenClaw 一起协作&#xff0c;其实就是搭建一个跨机器的 “小龙虾通信网络”。实现方式分两种&#xff1a;简单直连&#xff08;适合测试 / 小集群&#xff09;和远程网关&#xff08;适合生产 / 稳定协作&#xff09;。下面给你一套直接能跑的完整方案。一、…...

**管线流程**:模型矩阵 × 视图矩阵 × 投影矩阵 × 顶点 → GPU自动完成裁剪/光栅化

一、二进制、八进制、十六进制的转换方法&#xff08;通俗版&#xff09; 本质&#xff1a;都是“逢几进一”的计数法&#xff0c;只是“底数”不同&#xff08;2/8/16&#xff09;。 二进制&#xff08;Base-2&#xff09;&#xff1a;只用 0 和 1&#xff0c;是计算机硬件唯一…...

FastAPI项目实战:用APIRouter快速搭建一个带用户和图书管理的小型API服务

FastAPI项目实战&#xff1a;用APIRouter构建用户与图书管理API服务 刚接触FastAPI时&#xff0c;最让我惊艳的不是它的性能&#xff0c;而是那种"开箱即用"的爽快感。上周接手一个需要快速原型验证的项目&#xff0c;从零开始搭建用户和图书管理接口&#xff0c;只…...

OpenClaw浏览器插件开发:Qwen3-14b_int4_awq增强网页交互能力

OpenClaw浏览器插件开发&#xff1a;Qwen3-14b_int4_awq增强网页交互能力 1. 为什么需要浏览器插件与OpenClaw结合 作为一个长期与浏览器打交道的开发者&#xff0c;我经常遇到需要批量处理网页数据的场景。传统做法是写一堆油猴脚本或手动复制粘贴&#xff0c;直到发现OpenC…...

IBM与Arm合作推进双架构主机系统开发

IBM和Arm宣布合作开发能够运行IBM和Arm双重工作负载的硬件&#xff0c;使Arm软件能够在IBM主机上运行。两家公司计划在三个方面展开合作&#xff1a;构建虚拟化工具&#xff0c;让Arm软件能够在IBM平台上运行&#xff1b;确保Arm应用程序符合受监管行业必须遵循的安全和数据驻留…...

C语言整数字节拆解:联合体与移位操作详解

1. 理解题目&#xff1a;整数字节拆解的核心需求 在嵌入式开发和底层系统编程中&#xff0c;处理多字节数据是家常便饭。就拿这个面试题来说&#xff0c;我们需要从32位无符号整数0x12345678中提取出它的四个独立字节。这看似简单的需求背后&#xff0c;其实涉及到计算机系统中…...

技术赋能B端拓客:号码核验行业的迭代与价值升级

2026年&#xff0c;数字经济高质量发展进入深水区&#xff0c;B端市场的竞争逻辑已从“规模制胜”转向“效能突围”&#xff0c;拓客环节的精细化、高效化成为企业构建核心竞争力的关键。号码核验作为B端拓客的前置基础性环节&#xff0c;直接关联线索质量、人力效能与拓客投入…...

基于单片机的全自动咖啡机控制系统设计

一、摘要 全自动咖啡机控制系统控制系统对于现今的日常家居生活和商业模式售卖都有着重大的影响力&#xff0c;随着社会快节奏的发展&#xff0c;传统的人工冲泡模式效率远远满足不了人们的日常需求&#xff0c;并且在冲调多口味咖啡方面&#xff0c;也没有良好的原料精准配比。…...

太空垃圾清理算法:近地轨道debug生死时速

当测试思维遭遇太空危机作为软件测试从业者&#xff0c;我们习惯于在虚拟的数字世界中寻找漏洞、调试代码、确保系统稳定运行。我们面对的是逻辑错误、内存泄漏、并发冲突&#xff0c;最严重的后果或许是服务中断或数据丢失。然而&#xff0c;请想象这样一个场景&#xff1a;你…...