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))

文哥博客(https://wenge365.com)属于文野个人博客,欢迎浏览使用

联系方式:qq:52292959 邮箱:52292959@qq.com

备案号:粤ICP备18108585号 友情链接