SwiftUI 组件协议 View

在 SwiftUI 中,这是一个视图协议,任何自定义的视图都遵循该协议,并实现协议属性 body 来提供具体的视图内容和行为。


public protocol View : _View {

    /// The type of view representing the body of this view.
    ///
    /// When you create a custom view, Swift infers this type from your
    /// implementation of the required `body` property.
    associatedtype Body : View

    /// Declares the content and behavior of this view.
    var body: Self.Body { get }
}

该属性返回一个遵循了 View 协议的视图,用来展示具体的内容。我们所有的视图相关行为,都将在该属性中进行。

一些属性设置

// 透明度
@inlinable public func opacity(_ opacity: Double) -> Self.Modified<_OpacityEffect>

// 视图是否可交互
public func disabled(_ disabled: Bool) -> Self.Modified<_EnvironmentKeyTransformModifier<Bool>>

// 位置
@inlinable public func position(_ position: CGPoint) -> Self.Modified<_PositionLayout>
@inlinable public func position(x: Length = 0, y: Length = 0) -> Self.Modified<_PositionLayout>

// 前景色
public func foregroundColor(_ color: Color?) -> Self.Modified<_EnvironmentKeyWritingModifier<Color?>>

// 视图模糊,值越大越模糊
@inlinable public func blur(radius: Length, opaque: Bool = false) -> Self.Modified<_BlurEffect>

// 亮度,其值在 0-1,值越大,越亮
@inlinable public func brightness(_ amount: Double) -> Self.Modified<_BrightnessEffect>

// 颜色反转
 @inlinable public func colorInvert() -> Self.Modified<_ColorInvertEffect>

// 颜色叠加/混合
@inlinable public func colorMultiply(_ color: Color) -> Self.Modified<_ColorMultiplyEffect>

// 添加阴影
    /// - Parameters:
    ///   - color: The shadow's color.
    ///   - radius: The shadow's size.
    ///   - x: A horizontal offset you use to position the shadow relative to
    ///     this view.
    ///   - y: A vertical offset you use to position the shadow relative to
    ///     this view.
    /// - Returns: A view that adds a shadow to this view.
    @inlinable public func shadow(color: Color = Color(.sRGBLinear, white: 0, opacity: 0.33), radius: Length, x: Length = 0, y: Length = 0) -> Self.Modified<_ShadowEffect>

// 缩放
public func imageScale(_ scale: Image.Scale) -> Self.Modified<_EnvironmentKeyWritingModifier<Image.Scale>>

// 字体
public func font(_ font: Font?) -> Self.Modified<_EnvironmentKeyWritingModifier<Font?>>

// 隐藏
public func hidden() -> Self.Modified<_HiddenModifier>

除此之外,该协议定义了一系列协议方法,供遵循该协议的组件进行使用。

手势

// 长按手势
public func longPressAction(minimumDuration: Double = 0.5, maximumDistance: Length = 10, _ action: @escaping () -> Void, pressing: ((Bool) -> Void)? = nil) -> _AutoResultView<Self>
// 点击
public func tapAction(count: Int = 1, _ action: @escaping () -> Void) -> _AutoResultView<Self>

视图显示/消失

// 视图显示的时候回调
public func onAppear(perform action: (() -> Void)? = nil) -> Self.Modified<_AppearanceActionModifier>

   // 视图消失的时候回调
    public func onDisappear(perform action: (() -> Void)? = nil) -> Self.Modified<_AppearanceActionModifier>

视图添加背景

@inlinable public func background<Background>(_ background: Background, alignment: Alignment = .center) -> Self.Modified<_BackgroundModifier<Background>> where Background : View

    @inlinable public func background<S>(_ content: S, cornerRadius: Length) -> Self.Modified<_BackgroundModifier<RoundedRectangle.Filled<S>>> where S : ShapeStyle

    @inlinable public func background<S>(_ content: S.Member, cornerRadius: Length) -> Self.Modified<_BackgroundModifier<RoundedRectangle.Filled<S>>> where S : ShapeStyle

    @inlinable public func background<S>(_ content: S.Member) -> Self.Modified<_BackgroundModifier<Rectangle.Filled<S>>> where S : ShapeStyle

添加的背景,可以是一个视图:

Text("Hello World").font(.largeTitle).color(.white).background(Image("image"), alignment: .center)

也可以是一个 Shape,或者颜色:

Text("Hello World").font(.largeTitle).color(.white).background(Color.gray)

添加遮罩层

    /// - Parameters:
    ///   - overlay: 遮罩视图
    ///   - alignment: 对齐方式
func overlay<Overlay>(_ overlay: Overlay, alignment: Alignment = .center) -> Self.Modified<_OverlayModifier<Overlay>> where Overlay : View

这里的 overlay 可以是一个视图:

Image("image").overlay(
            HStack{
                Text("Hello World")
                Spacer()
        }.padding().foregroundColor(.white).background(Color.black), alignment: .bottom)

也可以是形状(Shape)

Image("image")
            .clipShape(Circle())
            .overlay(Circle().stroke(Color.gray, lineWidth: 4))
            .shadow(radius: 10)

系统定义了一些形状:Circle、Rectangle、RoundedRectangle、RotatedShape等,他们都遵循Shape协议,详情可参考 Shape;

添加边框

    /// - Parameters:
    ///   - content: 边框颜色
    ///   - width: 边框的宽
    @inlinable public func border<S>(_ content: S, width: Length = 1) -> Self.Modified<_OverlayModifier<Rectangle.InsetShape.Stroked.Filled<S>>> where S : ShapeStyle

例如:

Image("image").border(Color.black, width: 6)

  • 添加圆角边框
/// - Parameters:
    ///   - content: 边框颜色
    ///   - width: 边框的宽
    ///   - cornerRadius: 圆角半径
@inlinable public func border<S>(_ content: S, width: Length = 1, cornerRadius: Length) -> Self.Modified<_OverlayModifier<RoundedRectangle.InsetShape.Stroked.Filled<S>>> where S : ShapeStyle

例如:

Image("image").border(Color.red, width: 6, cornerRadius: 40)

该方法添加的圆角,圆角部分不会裁去,只是在视图内添加了一个圆角的边框,如果想要裁去圆角部分,可结合 cornerRadius方法一起使用:

Image("image").border(Color.red, width: 6, cornerRadius: 40).cornerRadius(40)

视图相对大小

    /// - Parameter proportion: 相对于父视图的相对宽度, 0-1的值
    @inlinable public func relativeWidth(_ proportion: Length) -> Self.Modified<_RelativeLayoutTraitsLayout>

/// - Parameter proportion: 相对父视图的相对高度
    @inlinable public func relativeHeight(_ proportion: Length) -> Self.Modified<_RelativeLayoutTraitsLayout>

    /// - Parameters:
    ///   - width: 相对于父视图的相对宽度
    ///   - height: 相对父视图的相对高度
    @inlinable public func relativeSize(width: Length, height: Length) -> Self.Modified<_RelativeLayoutTraitsLayout>

例如

Color.purple
            .relativeSize(width: 0.75, height: 0.75)
            .frame(width: 200, height: 200)
            .border(Color.gray)

设置视图固定宽高比


    /// - Parameters:
    ///   - aspectRatio: 宽高比
    ///   - contentMode: 填充模式 fit or fill
    @inlinable public func aspectRatio(_ aspectRatio: Length? = nil, contentMode: ContentMode) -> Self.Modified<_AspectRatioLayout>


    /// - Parameters:
    ///   - aspectRatio: 宽高比,例如 Size(width: 3, height: 4) 为 3: 4
    ///   - contentMode: 填充模式
    @inlinable public func aspectRatio(_ aspectRatio: CGSize, contentMode: ContentMode) -> Self.Modified<_AspectRatioLayout>

// 等比例缩放
 @inlinable public func scaledToFit() -> Self.Modified<_AspectRatioLayout>

// 铺满填充
@inlinable public func scaledToFill() -> Self.Modified<_AspectRatioLayout>

裁切


   /// - Parameters:
    ///   - shape: 裁切的形状,Shape
    ///   - style: 填充
    @inlinable public func clipShape<S>(_ shape: S, style: FillStyle = FillStyle()) -> Self.Modified<_ClipEffect<S>> where S : Shape

/// 裁切超出区域的视图
 /// - Parameter antialiased:在裁切时是否平滑处理
    @inlinable public func clipped(antialiased: Bool = false) -> Self.Modified<_ClipEffect<Rectangle>>

/// 裁切圆角
/// - Parameter radius:圆角半径
/// - Parameter antialiased: 在裁切时是否平滑处理
    @inlinable public func cornerRadius(_ radius: Length, antialiased: Bool = true) -> Self.Modified<_ClipEffect<RoundedRectangle>>
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 212,294评论 6 493
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 90,493评论 3 385
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 157,790评论 0 348
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 56,595评论 1 284
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 65,718评论 6 386
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 49,906评论 1 290
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 39,053评论 3 410
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 37,797评论 0 268
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 44,250评论 1 303
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 36,570评论 2 327
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 38,711评论 1 341
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 34,388评论 4 332
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 40,018评论 3 316
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 30,796评论 0 21
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 32,023评论 1 266
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 46,461评论 2 360
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 43,595评论 2 350

推荐阅读更多精彩内容