首页 > 其他分享 >SwiftUI中SafeArea的管理与使用(ignoresSafeArea, safeAreaPadding, safeAreaInset)

SwiftUI中SafeArea的管理与使用(ignoresSafeArea, safeAreaPadding, safeAreaInset)

时间:2024-05-31 21:58:11浏览次数:27  
标签:修饰符 视图 区域 SwiftUI safeAreaInset safeAreaPadding View

SafeArea是指不与视图控制器提供的导航栏、选项卡栏、工具栏或其他视图重叠的内容空间。

UIKit中,开发人员需要使用safeAreaInsetssafeAreaLayoutGuide来确保视图被放置在界面的可见部分。

SwiftUI彻底简化了上述过程,除非开发者明确要求视图突破安全区域的限制,否则SwiftUI将尽力确保开发者创建的视图布局在安全区域内。SwiftUI还为开发者提供了一些控制安全区域的方法和工具。

Safe area

安全区域帮助我们将视线保持在屏幕可见部分之内。例如,我们可以使用安全区域轻松地将视图放置在导航条和home指示器之间。

在这里插入图片描述

默认情况下,SwiftUI只在安全区域内放置视图,比如下面这段代码。

struct SafeAreaDemo: View {
  var body: some View {
    NavigationView {
      ZStack {
        LinearGradient(
          colors: [.red, .yellow],
          startPoint: .topLeading,
          endPoint: .bottomTrailing
        )
      }
      .navigationTitle("Hello World")
    }
  }
}

在这里插入图片描述

ignoresSafeArea修饰符

我们可以通过ignoresSafeArea修饰符改变系统这一行为。

struct SafeAreaDemo: View {
  var body: some View {
    NavigationView {
      ZStack {
        LinearGradient(
          colors: [.red, .yellow],
          startPoint: .topLeading,
          endPoint: .bottomTrailing
        )
      }
      .ignoresSafeArea()
      .navigationTitle("Hello World")
    }
  }
}

在这里插入图片描述

ignoresSafeArea视图修饰符通过忽略安全区域来扩展视图并填充空间。ignoresSafeArea视图修饰符有两个参数,允许我们设置被忽略的安全区域的方向和区域。

    /// - Parameters:
    ///   - regions: The regions to expand the view's safe area into. The
    ///     modifier expands into all safe area region types by default.
    ///   - edges: The set of edges to expand. Any edges that you
    ///     don't include in this set remain unchanged. The set includes all
    ///     edges by default.
    ///
    /// - Returns: A view with an expanded safe area.
    @inlinable public func ignoresSafeArea(_ regions: SafeAreaRegions = .all, edges: Edge.Set = .all) -> some View
  • regions参数允许我们设置被忽略的安全区域类型。SafeAreaRegions的可选类型主要有下面三种:
// 所有类型
static let all: SafeAreaRegions
// 在用户界面内由设备和容器定义的安全区域,包括顶部和底部条等元素。
static let container: SafeAreaRegions
// 安全区域匹配当前显示在视图内容上的任何软件键盘的范围。
static let keyboard: SafeAreaRegions
  • edges参数允许我们忽略一个方向或一组方向上的安全区域。例如,它可以是top, leading, bottom, trailing, horizontal, vertical, all或前面选项的任意组合。

safeAreaPadding修饰符

SwiftUI提供的safeAreaPadding修饰符允许我们将安全区的一个边或者多个边设置指定的边距,safeAreaPadding修饰符只在iOS 17或者tvOS 17及以后可以使用。

struct SafeAreaDemo: View {
  var body: some View {
    NavigationView {
      ZStack {
        LinearGradient(
          colors: [.red, .yellow],
          startPoint: .topLeading,
          endPoint: .bottomTrailing
        )
      }
      .safeAreaPadding(.all, 100) // 安全区四边缩进100.
      .navigationTitle("Hello World")
    }
  }
}

在这里插入图片描述

safeAreaInset修饰符

safeAreaInset视图修饰符是管理视图安全区域的另一种方法。safeAreaInset视图修饰符允许通过在视图的原始安全区域内放置另一个视图来移动或改变视图的安全区域。

func safeAreaInset<V>(
    edge: VerticalEdge,
    alignment: HorizontalAlignment = .center,
    spacing: CGFloat? = nil,
    @ViewBuilder content: () -> V
) -> some View where V : View
struct SafeAreaDemo: View {
  var body: some View {
    NavigationView {
      ZStack {
        LinearGradient(
          colors: [.red, .yellow],
          startPoint: .topLeading,
          endPoint: .bottomTrailing
        )
      }
      .navigationTitle("Hello World")
      .safeAreaInset(edge: .bottom, alignment: .center, spacing: 0) {
        Text("Tap")
          .frame(width: 50)
          .background(Color.red)
      }
      .safeAreaInset(edge: .top, alignment: .center, spacing: 0) {
        Text("Tap")
          .frame(maxWidth: .infinity)
          .background(Color.blue)
      }
    }
  }
}

在这里插入图片描述

safeAreaInset修饰符有一堆参数:

  • edge: 决定视图要插在垂直边缘的哪个边上,高度不够的时候会根据内容视图的高度决定。
  • alignment:决定视图在水平方向的位置。
  • spacing:两个视图之间放置的额外距离,或nil以使用默认的间距量。调整视图垂直方向的距离。
  • content:提供一个视图。

content被锚定到父视图中指定的垂直边缘,使其水平轴与指定的alignment对齐。安全区高度不够的时候会根据content视图的高度决定。

写在最后

本篇文章主要了解了如何在SwiftUI中管理安全区域。通常,我们不需要管它,因为SwiftUI会自动处理它。但是我们也可以使用安全区域视图修饰器自定义内容以及一些外观等等。

标签:修饰符,视图,区域,SwiftUI,safeAreaInset,safeAreaPadding,View
From: https://blog.csdn.net/guoyongming925/article/details/139339186

相关文章

  • SwiftUI中AsyncImage的使用(一个高效的异步下载图片组件)
    iOS开发者经常会遇到需要在应用中显示网络图像的场景,无论是获取和显示用户头像,展示产品图像,等等。在原来的UIKit中,如果我们要用系统的API还是稍微有点麻烦,很多开发的朋友都选择了第三方的框架去处理网络图片的请求缓存等等。AsyncImage是SwiftUI中一个强大的功能,它简化了在......
  • SwiftUI中的组合动画(Simultaneous, Sequenced, Exclusive)
    了解了常见的几种手势后,接下来我们了解一下组合手势的操作,当一个视图存在多个手势的时候,为了避免手势冲突,SwiftUI提供了自定义手势的方法,比如同时进行,顺序进行等等。以下是一些常见的多种手势组合使用方式:simultaneously(with:):同时使用多个手势,使它们可以同时响应用户的......
  • SwiftUI中的手势(TapGesture、LongPressGesture、GestureState的使用)
    手势操作在App中可谓是用途非常广泛了,常规的手势修饰符有TapGesture点击手势、LongPressGesture长按手势、DragGesture拖拽手势,MagnificationGesture放缩手势和RoationGesture旋转手势。和常规的修饰符方法类似,只要将手势修饰符添加到视图中,系统就会自动识别用户的操作,并......
  • SwiftUI中的手势(DragGesture拖拽手势及Drag动画组件)
    上一篇文章我们了解了如何使用.gesture修饰符和@GestureState属性包装器,让我们看看另一种常见的手势:DragGesture拖拽手势。下面先看个效果图:这个效果中,我们实现了一个Text文本,并添加了拖拽手势,可以拖动到屏幕的任意位置,松手后停留在目标位置,而非回到原来的起点位置。UI......
  • SwiftUI State,Binding 状态管理
    代码////ContentView.swift//SwiftUIState////CreatedbyCHENHaoon2024/5/8.//importSwiftUIstructContentView:View{@StateprivatevarisPlaying=false@StateprivatevarclickNumber1=0@StateprivatevarclickNumber2=0......
  • DevTutor 一款旨在帮助开发者使用 SwiftUI 创建出色应用程序的应用
    提供可复制的代码示例和相应的用户界面预览,以简化您的编码过程。此外,还包括了《Swift编程语言》官方中英文文档的本地离线预览。主要功能■提供可直接在您的项目中使用的样本代码■实时查看您的代码如何影响应用的外观■提供官方中英文Swift编程语言离线文档■探索第......
  • SwiftUI ScrollView 滚动视图
    代码////ContentView.swift//SwiftUIScrollView////CreatedbyCHENHaoon2024/5/7.//importSwiftUIstructContentView:View{varbody:someView{VStack(alignment:.leading){VStack(alignment:.leading){......
  • SwiftUI ZStack、HStack、VStack 布局
    代码////ContentView.swift//SwiftUIStacks////CreatedbyCHENHaoon2024/5/6.//importSwiftUIstructContentView:View{varbody:someView{VStack(spacing:15){HeaderView()HStack(spacing:15){......
  • SwiftUI Image 图片处理
    代码片段////ContentView.swift//SwiftUIImage////CreatedbyCHENHaoon2024/5/6.//importSwiftUIstructContentView:View{varbody:someView{Image("paris").resizable()//延伸模式,平铺整个屏幕/......
  • SwiftUI Text 文字处理
    代码////ContentView.swift//SwiftUIText////CreatedbyCHENHaoon2024/5/6.//importSwiftUIstructContentView:View{varbody:someView{VStack{Text("Yourtimeislimited,sodon’twasteitlivingsomeoneels......