SwiftUI Modifier之padding
所属分类:ios | 发布于 2022-11-28 10:29:18
通过这边文章,不止是要掌握padding的用法,更重要的是掌握学习的思路。
在xcode中输入.padd后会自动带出下面的方法提示
我这里看到的是padding有三个方法,但是网上的文章很多都是能显示4个方法,还有一个没有任何参数的padding()方法,我猜这可能和版本有关,现在是22年11月,我这里用的是最新的xcode14。
这里就分析我看到的这三个方法,三个方法的定义是:
@available(iOS 13.0, macOS 10.15, tvOS 13.0, watchOS 6.0, *)
extension View {
@inlinable public func padding(_ insets: EdgeInsets) -> some View
@inlinable public func padding(_ edges: Edge.Set = .all, _ length: CGFloat? = nil) -> some View
@inlinable public func padding(_ length: CGFloat) -> some View
}
1、方法一padding(_ length: CGFloat)
定义:
@inlinable public func padding(_ length: CGFloat) -> some View
解释:
这个修饰器方法,显式声明不需要实参标签,形参名为length,参数类型是CGFloat。换句话说,调用的时候,只需要传入一个CGFloat的值就可以。CGFloat,CGFloat只是针对Float和Double的typefo定义,在64位系统上,CGFloat就是Double, 在32位系统上,CGFLoat就是Float。
调用:
.padding(20)
2、方法二padding(_ edges: Edge.Set = .all, _ length: CGFloat? = nil)
定义:
@inlinable public func padding(_ edges: Edge.Set = .all, _ length: CGFloat? = nil) -> some View
解释:
这个方法定义了两个参数,第一个参数是Edge.Set类型,这是一个meun类型,第二个参数length是CGFLoat类型。同样这两个参数显式声明不使用实参标签。
调用:
Text("SwfitUI").padding(.all)
Text("SwfitUI").padding(.all, 20)
Text("SwfitUI").padding(.vertical)
Text("SwiftUI").padding([.leading, .bottom], 10)
Edge.Set的定义:
/// An enumeration to indicate one edge of a rectangle.
@available(iOS 13.0, macOS 10.15, tvOS 13.0, watchOS 6.0, *)
@frozen public enum Edge : Int8, CaseIterable {
case top
case leading
case bottom
case trailing
/// An efficient set of `Edge`s.
@frozen public struct Set : OptionSet {
public typealias Element = Edge.Set // default
public let rawValue: Int8
public init(rawValue: Int8)
public static let top: Edge.Set // 上
public static let leading: Edge.Set // 头,别名左
public static let bottom: Edge.Set // 下
public static let trailing: Edge.Set // 尾,别名右
public static let all: Edge.Set // 所有,四个方向
public static let horizontal: Edge.Set // 水平方向,头尾,别名左右
public static let vertical: Edge.Set // 垂直方向,上下
public init(_ e: Edge)
public typealias ArrayLiteralElement = Edge.Set.Element
public typealias RawValue = Int8
}
public init?(rawValue: Int8)
public typealias AllCases = [Edge]
public typealias RawValue = Int8
public static var allCases: [Edge] { get }
public var rawValue: Int8 { get }
}
拓展:
由于这个方法,第一个参数有默认值,第二个参数是可选类型,所以这两个参数在调用的时候不用初始化,又因为这两个参数又都显式声明不适用实参标签,所以在调用的时候就可以使用padding(),也就是其它文章中见到的不带参数的padding方法。
扩展2:
.padding([.leading, .bottom], 10),这种写法,为什么能传入一个Edge.Set类型的数组,着实还没看明白。
3、方法三padding(_ insets: EdgeInsets)
定义:
@inlinable public func padding(_ insets: EdgeInsets) -> some View
这个方法传入一个EdgeInsets类型的参数,通用显式声明不使用实参标签。
EdgeInsets的定义:
/// The inset distances for the sides of a rectangle.
@available(iOS 13.0, macOS 10.15, tvOS 13.0, watchOS 6.0, *)
@frozen public struct EdgeInsets : Equatable {
public var top: CGFloat
public var leading: CGFloat
public var bottom: CGFloat
public var trailing: CGFloat
@inlinable public init(top: CGFloat, leading: CGFloat, bottom: CGFloat, trailing: CGFloat)
@inlinable public init()
public static func == (a: EdgeInsets, b: EdgeInsets) -> Bool
}
调用:
Text("SwiftUI").padding(EdgeInsets(top: 10, leading: 20, bottom: 30, trailing: 40))