SwiftUI 組件協(xié)議 View

在 SwiftUI 中凰浮,這是一個視圖協(xié)議膜廊,任何自定義的視圖都遵循該協(xié)議选泻,并實現(xiàn)協(xié)議屬性 body 來提供具體的視圖內(nèi)容和行為冲粤。


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 協(xié)議的視圖,用來展示具體的內(nèi)容页眯。我們所有的視圖相關(guān)行為梯捕,都將在該屬性中進(jìn)行。

一些屬性設(shè)置

// 透明度
@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>

// 顏色反轉(zhuǎn)
 @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>

除此之外短曾,該協(xié)議定義了一系列協(xié)議方法,供遵循該協(xié)議的組件進(jìn)行使用赐劣。

手勢

// 長按手勢
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>

視圖顯示/消失

// 視圖顯示的時候回調(diào)
public func onAppear(perform action: (() -> Void)? = nil) -> Self.Modified<_AppearanceActionModifier>

   // 視圖消失的時候回調(diào)
    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)

系統(tǒng)定義了一些形狀:Circle魁兼、Rectangle婉徘、RoundedRectangle、RotatedShape等咐汞,他們都遵循Shape協(xié)議盖呼,詳情可參考 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)

該方法添加的圓角碉考,圓角部分不會裁去,只是在視圖內(nèi)添加了一個圓角的邊框挺身,如果想要裁去圓角部分侯谁,可結(jié)合 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)

設(shè)置視圖固定寬高比


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

/// 裁切超出區(qū)域的視圖
 /// - 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>>
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末热芹,一起剝皮案震驚了整個濱河市,隨后出現(xiàn)的幾起案子惨撇,更是在濱河造成了極大的恐慌伊脓,老刑警劉巖,帶你破解...
    沈念sama閱讀 218,036評論 6 506
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件魁衙,死亡現(xiàn)場離奇詭異报腔,居然都是意外死亡,警方通過查閱死者的電腦和手機(jī)剖淀,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 93,046評論 3 395
  • 文/潘曉璐 我一進(jìn)店門纯蛾,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人纵隔,你說我怎么就攤上這事翻诉。” “怎么了捌刮?”我有些...
    開封第一講書人閱讀 164,411評論 0 354
  • 文/不壞的土叔 我叫張陵碰煌,是天一觀的道長。 經(jīng)常有香客問我绅作,道長芦圾,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 58,622評論 1 293
  • 正文 為了忘掉前任棚蓄,我火速辦了婚禮堕扶,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘梭依。我一直安慰自己稍算,他們只是感情好,可當(dāng)我...
    茶點故事閱讀 67,661評論 6 392
  • 文/花漫 我一把揭開白布役拴。 她就那樣靜靜地躺著糊探,像睡著了一般。 火紅的嫁衣襯著肌膚如雪河闰。 梳的紋絲不亂的頭發(fā)上科平,一...
    開封第一講書人閱讀 51,521評論 1 304
  • 那天,我揣著相機(jī)與錄音姜性,去河邊找鬼瞪慧。 笑死,一個胖子當(dāng)著我的面吹牛部念,可吹牛的內(nèi)容都是我干的弃酌。 我是一名探鬼主播氨菇,決...
    沈念sama閱讀 40,288評論 3 418
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼妓湘!你這毒婦竟也來了查蓉?” 一聲冷哼從身側(cè)響起,我...
    開封第一講書人閱讀 39,200評論 0 276
  • 序言:老撾萬榮一對情侶失蹤榜贴,失蹤者是張志新(化名)和其女友劉穎豌研,沒想到半個月后,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體唬党,經(jīng)...
    沈念sama閱讀 45,644評論 1 314
  • 正文 獨居荒郊野嶺守林人離奇死亡鹃共,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 37,837評論 3 336
  • 正文 我和宋清朗相戀三年,在試婚紗的時候發(fā)現(xiàn)自己被綠了初嘹。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片及汉。...
    茶點故事閱讀 39,953評論 1 348
  • 序言:一個原本活蹦亂跳的男人離奇死亡,死狀恐怖屯烦,靈堂內(nèi)的尸體忽然破棺而出坷随,到底是詐尸還是另有隱情,我是刑警寧澤驻龟,帶...
    沈念sama閱讀 35,673評論 5 346
  • 正文 年R本政府宣布温眉,位于F島的核電站,受9級特大地震影響翁狐,放射性物質(zhì)發(fā)生泄漏类溢。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點故事閱讀 41,281評論 3 329
  • 文/蒙蒙 一露懒、第九天 我趴在偏房一處隱蔽的房頂上張望闯冷。 院中可真熱鬧,春花似錦懈词、人聲如沸蛇耀。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,889評論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽纺涤。三九已至,卻和暖如春抠忘,著一層夾襖步出監(jiān)牢的瞬間撩炊,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 33,011評論 1 269
  • 我被黑心中介騙來泰國打工崎脉, 沒想到剛下飛機(jī)就差點兒被人妖公主榨干…… 1. 我叫王不留拧咳,地道東北人。 一個月前我還...
    沈念sama閱讀 48,119評論 3 370
  • 正文 我出身青樓囚灼,卻偏偏與公主長得像骆膝,于是被迫代替她去往敵國和親砾淌。 傳聞我的和親對象是個殘疾皇子演熟,可洞房花燭夜當(dāng)晚...
    茶點故事閱讀 44,901評論 2 355

推薦閱讀更多精彩內(nèi)容