本文我们将讨论SwiftUI中的另一个核心流程。我们将学习布置视图的过程。我们将了解SwiftUI如何计算视图的位置和大小,以及如何使用布局优先级更改该过程。

基本

您可以构建常规视图,而无需真正了解布局过程。 SwiftUI具有声明性,您必须描述要实现的目标,SwiftUI会理解它。让我们从SwiftUI中的“ Hello World”应用程序的简单示例开始讨论。

import SwiftUI

struct MessageView: View {
    var body: some View {
        Text("Hello World!!!")
    }
}

假设MessageView是我们应用程序的根视图。

  • SwiftUI将所有可用空间传递给MessageView。
  • MessageView仅有一个子级,即文本视图。 MessageView为文本视图建议可用空间,并要求其计算其大小。
  • 文本视图测量其内容的大小,并将其传递回MessageView。
  • MessageView现在可以理解文本视图的大小,并将其放置在可用空间的中心。
    这就是SwiftUI布局系统的工作方式。它始终应用这四个步骤。

布局优先

我们来看一个更复杂的示例,该示例在HStack中具有多个同级视图。

import SwiftUI

struct MessageView: View {
    var body: some View {
        HStack(spacing: 16) {
            Text("Hello")
            Text("World")
            Text("!!!")
        }
        .font(.largeTitle)
    }
}

垂直和水平堆栈在布局过程中还有其他步骤。

  • 首先,堆栈视图计算项目之间的自适应间距,并从可用空间中扣除。
  • 然后,堆栈视图将可用空间分成相等的部分,并将其中一个提供给第一个孩子。
  • 子视图计算其大小并将其返回到父堆栈。
  • 下一步,堆栈从可用空间中减去第一个子项的大小,然后再次将其分成相等的部分。
  • 堆栈视图根据需要多次重复此过程,以计算每个孩子的大小。
  • 最后,堆栈视图将项之间的间距与子项的计算大小相加,以了解其自身的大小并将其传递回父项。

我们可以在此过程中调整的一件事是提议大小的顺序。通常,SwiftUI使用最不灵活的视图在堆栈内部启动布局过程。但是我们可以使用layoutPriority修饰符更改此规则。布局优先级定义了尺寸建议过程的顺序。默认情况下,所有视图的默认优先级均为0。 SwiftUI允许我们使用layoutPriority修饰符设置自定义布局优先级。 SwiftUI使用布局优先级按降序对视图进行排序。这意味着SwiftUI将首先提出具有更高优先级的视图。

import SwiftUI

struct MessageView: View {
    var body: some View {
        HStack(spacing: 16) {
            Text("Hello")
            Text("World")
            Text("!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!")
                .layoutPriority(1)
        }
        .font(.largeTitle)
        .lineLimit(1)
    }
}





swift 带参数通知使用 swift message priority_堆栈


Jietu20200416-202651@2x.jpg


import SwiftUI

struct MessageView: View {
    var body: some View {
        HStack(spacing: 16) {
            Text("Hello")
            Text("World")
            Text("!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!")
        }
        .font(.largeTitle)
        .lineLimit(1)
    }
}



swift 带参数通知使用 swift message priority_swift 带参数通知使用_02


image.png


如您在上面的示例中看到的,我们使用layoutPriority修饰符更改布局过程的顺序。 SwiftUI将使用HStack中的最新视图启动尺寸建议过程,因为它在视图层次结构中具有最高优先级。尝试删除layoutPriority修饰符以了解其工作原理。

结论

本周,我们了解了SwiftUI的另一个令人兴奋的功能。老实说,我没有太多使用布局优先级。通常,我可以在不更改优先级的情况下构建所需的布局,但是很高兴知道我们在工具箱中有此工具。