如何優雅地在Storyboard中設定圓角

2021-09-22 19:41:35 字數 2543 閱讀 7491

1

view.layer

.cornerradius = 5

對於 storyboard 狂魔,一般情況下,很多人會先把檢視拉乙個 iboutlet 然後再到awakefromenib:或者viewdidload:方法中去設定圓角,**如下:

123456

@iboutlet

weak

var customview: uiview!

override

func

viewdidload()

但是對**有一定潔癖的強迫症患者來說,這樣的做法經常是要命的!實在無法忍受乙個小小圓角都不能在ib中設定,需要另外單獨加一行**來完成,違背了低耦合,高內聚的原則。有人馬上提出建議,那就使用ib的執行時屬性(runtime attributes),有些新手可能對它還不太熟悉:

這的確也是個不錯的方法,可以達到高內聚的效果。不過用過的人都知道,很容易就把 keypath 拼寫錯,而且由於這個設定和其他屬性的設定分開,可讀性可以說很差很差。那有沒有什麼好的方法呢?

xcode6之後執行時屬性公升級到了@ibinspectable,利用這個我們可以給 uiview 新增乙個屬性,然後就可以在ib中進行設定,例如我們想給viewcontroller新增乙個數值到ib中設定,在上述**的最前面插入**:

1

@ibinspectable

var customnumber: int?

然後我們就能在屬性檢查器上看到如圖所示內容,很容易地對數值進行設定:

@ibinspectable還支援以下型別屬性:

回到正題,我們檢視的圓角該怎麼實現呢?也許你們馬上想到了繼承,實現乙個uiview的基類,基類中新增圓角的@ibinspectable屬性。但這樣你馬上嗅到了不好的味道,你所有想要使用該屬性的檢視都要繼承自該基類,那豈不是更加麻煩!

其實最好的解決方法你應該心裡有數,如果說在 object-c 中給已有的類新增方法,你肯定馬上能想到category!不過可能有些人還沒不清楚應該如何在category中新增屬性。由於這裡我們用的是 swift ,稍後我們再說oc中應該如何實現。 swift 中應該使用extension來對uiview進行擴充套件,並且我們需要新增@ibinspectable來擴充套件屬性,所以我們需要同時實現setter & getter,建立乙個命名為uiview+o2cornerradius.swift的檔案,**如下:

123

4567

891011

1213

import uikit

extension

uiview

// also set(newvalue)

set }}

只需要如此簡單地新增乙個擴充套件,不需要import,不必任何多餘**,我們就可以非常非常方便地在任意ib的屬性檢查器中對圓角進行設定了!這不就是我們夢寐以求的解耦嗎?!!:)

實際上,@ibinspectable是對執行時的一種擴充套件,你所有的設定都會在上述提到的執行時屬性(runtime attributes)有所體現。

我們還可以增加很多內容的擴充套件,例如陰影、邊框、邊框顏色等等!學會了這樣的奇淫技巧,還不趕緊到你的專案中去實踐!

說說 object-c 的**實現,我們使用category同樣需要同時實現setter & getter:

123456

//uiview+o2cornerradius.h

@inte***ce uiview (o2cornerradius)

@property (nonatomic, assign) ibinspectable cgfloat cornerradius;

@end

123

4567

891011

1213

//uiview+o2cornerradius.m

@implementation

uiview (o2cornerradius)

- (void)setcornerradius:(cgfloat)cornerradius

- (cgfloat)cornerradius

@end

ios

swift

移動開發

上次更新:2019-04-20 19:28:31

如何優雅地寫部落格

如何優雅地寫部落格 現在寫部落格面臨著幾個問題 編寫麻煩,大部分的部落格編輯器都很爛,csdn和等等。維護麻煩,維護多個部落格的資料同步很麻煩。歷史檢視,大部分部落格編寫都不能檢視之前的歷史資料。用github做部落格倉庫,將資料都寫在github上,這樣可以隨時檢視一年前的部落格資料,方便在原文件...

如何優雅地書寫JavaScript

這篇文章包含了幾乎所有關於提高 質量的內容,尤其是在構建大型應用程式時。主要包括四個部分 本主題僅涉及原生js,關於框架 比如react和vue 的內容會在以後的文章中展現。我想你們大多數人之前都聽說過solid,也就是物件導向設計裡的solid原則。這些原則基於物件導向設計,所以可能不適合其他程式...

如何優雅地關閉SparkStreaming

how to shutdown a spark streaming job gracefully 17 02 02 01 31 35 info streaming.streamingcontext invoking stop stopgracefully true from shutdown hoo...