
swiftUIではText()やButton()などさまざまなViewがあり、
コードに記載することで、スクリーン上で表示されます。
HTMLでもText()であればspanタグ、pタグ、labelタグだったり、
Button()であればbuttonタグなど
同じようなことができ、
割と画面の描写についてはSwiftUIとHTMLとで近かったりします。
そんな中で、HTML()でstyle要素だったり、styleタグ、さらにはlinkタグで外部cssファイル読み込みなどで、
指定したものに対してcssを一括適用などができたりします。
であれば、SwiftUIでも同じようなことができるのではと思います。
簡単ですが以下のようにextensionを用いることでできます。
これができると、extensionの中身を変えるだけで、
一括でデザインを適用することができて保守も楽になります。
サンプルコード
extension Text{
public func Title() -> Text{
self.font(.title)
.fontWeight(.medium)
.foregroundColor(Color.black)
}
}
extension Text{
public func SubTitle() -> Text{
self.font(.title)
.foregroundColor(Color.blue)
}
}
基本的なViewの1つであるText()についてCSSチックなことをやっていきます。
Text()に適用するので、extensionでTextクラスを拡張します。
そこで独自メソッド(モディファイア)を作成します。
モディファイアを適用しても返すのはTextオブジェクトなので、戻り値の方はTextになります。
そして、Textクラスのプロパティを見ると、さまざまな色やフォントなどのクラスを継承しているので、上記のような書き方を書くことができ、
独自モディファイアのTitle()ではfontの大きさや、黒色を指定しています。
これにより
Text().Title()
と実行することで、フォントや黒色をそのまま適用できます。
以下のようにしてViewModifierを使うこともできます。
extension View{
/**
ログイン画面でのログインボタン
*/
@ViewBuilder
public func LoginButtonStyle() -> some View{
self
.frame(maxWidth: 200, minHeight: 30)
.foregroundColor(Color.white)
.overlay(
RoundedRectangle(cornerRadius: 5)
.stroke(Color(red: 0.85, green: 0.564, blue:0.12), lineWidth: 2)
)
.background(
RoundedRectangle(cornerRadius: 5, style: .continuous).fill(Color(red: 0.85, green: 0.564, blue:0.12))
)
.opacity(0.8)
}
}
struct ContentView: View{
var body: some View{
VStack(){
Button(action:{
},label:{
Text("ログインする").foregroundColor(Color.gray)
}).LoginButtonStyle()
}
}
}