background()
background 为背景修饰符,可以添加某个 View 的背景颜色(不是 View 本身的颜色)或者形状。
//添加背景色 struct ContentView: View { var body: some View { Text("背景色") .padding() .background(Color.red) } }
//添加形状 struct ContentView: View { var body: some View { Text("形状背景").foregroundColor(.white).padding() .background( RoundedRectangle(cornerRadius: 10) .foregroundColor(.red) .frame(height:60) ) } }
cornerRadius()、border()
在 UIKit 中我们常常会设置某个 View 的圆角和边框,在 SwiftUI 中使用 cornerRadius 和 border 修饰符即可。
struct ContentView: View { var body: some View { Text("圆角和边框") .padding() .background(Color.blue) .cornerRadius(25) //圆角 .border(Color.green, width: 4) //边框 } }
shadow()
shadow 用于给 View 设置阴影。
struct ContentView: View { var body: some View { Text("阴影") .shadow(color: .red, radius: 5, x: 0, y: 0) } }
若我们给 VStack 或 HStack 设置,里面所有的内容都会有阴影。可以给它们的 background 设置颜色或阴影,此时阴影只对 background 起作用。
struct ContentView: View { var body: some View { VStack { Text("阴影") Text("阴影") Text("阴影") } .padding() .background(Color.white.shadow(color: .red, radius: 5)) } }
实际项目中经常会出现卡片样式的圆角阴影,这种需要设置一下偏移。
struct ContentView: View { var body: some View { VStack { Text("卡片样式阴影") .font(.system(size: 20)) } .padding() .background(Color.white ) .cornerRadius(10) .shadow(radius: 5, y: 2) } }
gradient()
gradient 为渐变色,一般作为背景使用。主要有三种渐变色:LinderGradient(线性渐变)、RadialGradient(径向渐变)、AngularGradient(角度渐变)。
struct ContentView: View { let gradient = Gradient(colors: [.red, .green]) var body: some View { VStack { // LinderGradient RoundedRectangle(cornerRadius: 10) .fill(LinearGradient(gradient: gradient, startPoint: .leading, endPoint: .trailing)) .frame(height:60) .padding() // RadialGradient RoundedRectangle(cornerRadius: 10) .fill(RadialGradient(gradient: gradient, center: .center, startRadius: 20, endRadius: 200)) .frame(height:60) .padding() // AngularGradient Circle() .fill(AngularGradient(gradient: Gradient(colors: [.red, .yellow, .green, .blue, .purple, .red]), center: .center)) .frame(height:120) .padding() } } }
下面的例子将渐变色作为了按钮的背景。
struct ContentView: View { var body: some View { Button(action: { }) { Text("删除") .font(.title) //与屏幕一样宽 .frame(minWidth: 0, maxWidth: .infinity) .padding() .background(LinearGradient( gradient: Gradient(colors: [.red, .green]), startPoint: .leading, endPoint: .trailing)) .cornerRadius(40) } } }
stroke() 与 strokeBorder()
stroke 与 strokeBorder 两个修饰符都是用于在形状周围绘制边框,其中 stroke 绘制的边框在 View 内部,strokeBorder 绘制的边框一半在 View 的内部,一半在外部。
需要注意,这两个修饰符仅适用于 Shape 而不能与其他非 Shape 的 View 一起使用,否则应改用 border。
//实现Shape的边框 struct ContentView: View { let gradient = Gradient(colors: [.orange, .red]) var body: some View { ZStack { //直接用border圆角不会出现 RoundedRectangle(cornerRadius: 10) .stroke(Color.green, style: StrokeStyle(lineWidth: 4)) .frame(height:60) RoundedRectangle(cornerRadius: 10) .fill(LinearGradient(gradient: gradient, startPoint: .leading, endPoint: .trailing)) .frame(height:60) }.padding() } }
//制作环形 struct ContentView: View { var body: some View { Circle() .strokeBorder(Color.blue, lineWidth: 50) } }
//实现图片“边框” struct ContentView: View { let gradient = Gradient(colors: [.purple, .blue]) var body: some View { Image(systemName: "clock") .resizable() .aspectRatio(contentMode: .fill) .frame(width: 80, height: 80) .clipShape(Circle()) // 通常操作是clipShape后overlay里面stroke .overlay(Circle() .stroke(LinearGradient(gradient: Gradient(colors: [.purple, .blue]), startPoint: .top, endPoint: .bottom), lineWidth: 2.0) ) } }
offset()
offset 修饰符可以设置 x 与 y 两个方向的相对于原位置的偏移而不会影响其他的元素,常用于 View 位置的微调。
struct ContentView: View { var body: some View { ZStack { RoundedRectangle(cornerRadius: 20) .foregroundColor(Color.green) .frame(width: 300, height: 100) .offset(x: -20, y: -20) RoundedRectangle(cornerRadius: 20) .foregroundColor(Color.red) .frame(width: 300, height: 100) RoundedRectangle(cornerRadius: 20) .foregroundColor(Color.purple) .frame(width: 300, height: 100) .offset(x: 20, y: 20) } } }
position()
SwiftUI 推荐使用弹性盒子布局,但也支持设置 position 进行绝对定位。坐标参考系为其所在的容器(和 UIKit 的 frame 类似)。
struct ContentView: View { var body: some View { // Text放置在(100, 100)的位置 Text("SwiftUI") .border(Color.red) .position(x: 100, y: 100) } }
overlay()
overlay 用于在某个 View 前面放置一个辅助 View。
与 background的区别:在 View前面添加用 overlay,在 View后面添加用 background。
这个辅助 View 默认是居中显示的,可以通过 alignment 参数设置显示在 View 的位置。
struct ContentView: View { var body: some View { VStack() { Spacer() } .frame(maxWidth: .infinity) .frame(height: 300) .background(Color.pink) .clipShape(RoundedRectangle(cornerRadius: 30, style: .continuous)) //裁成圆角矩形 .padding(.horizontal, 30) //左右两边有边距 .overlay( //前面放一个圆形图片 Image("img") .resizable() .frame(width: 60, height: 60) .clipShape(Circle()) .offset(y: -150) ) } }
mask()
mask 为遮罩,常用于某个 View 遮罩另外一个 View 从而产生特殊的视觉效果。
//渐变文本 struct ContentView: View { let text = Text("SwiftUI") .font(.system(size: 50)) var body: some View { text .overlay(LinearGradient(gradient: Gradient(colors: [.orange, .blue]), startPoint: .leading, endPoint: .trailing)) .mask(text) } }
//文字图片融合 struct ContentView: View { let text = Text("Steve Jobs") .font(.system(size: 40)) var body: some View { text .overlay(Image("jobs")) .mask(text) } }
//图片与图片融合 struct ContentView: View { var body: some View { Image(systemName: "hare") .resizable() .scaledToFit() .frame(width:100, height: 100) .overlayMask(Image("jobs")) } } extension View { //自定义一个函数利用overlay产生mask public func overlayMask<T: View>(_ overlay: T) -> some View { self .overlay(overlay) .mask(self) } }
blur()
用于设置毛玻璃效果。
struct ContentView: View { var body: some View { VStack { Image("jobs") .resizable() .frame(width: 300, height: 300) .blur(radius: 20) Text("乔布斯") .blur(radius: 2) } } }
accentColor()
accentColor 类似于 UIKit 中的 tintColor,可以设置按钮渲染的颜色。
struct ContentView: View { var body: some View { VStack { Text("Hello SwiftUI") Button("按钮") { } }.accentColor(.orange) //按钮被渲染为橘色 } }
edgesIgnoringSafeArea()
使用 edgesIgnoringSafeArea 可以忽略安全区域,常用于设置全屏 View。
struct ContentView: View { var body: some View { Image("bg") .resizable() .scaledToFill() .edgesIgnoringSafeArea(.all) } }
状态栏显隐
在某些场景下,我们可能需要隐藏状态栏(例如视频播放、游戏界面等),可以通过设置 .statusBar(hidden: )解决。
//始终隐藏状态栏 struct ContentView: View { var body: some View { Text("Hello SwiftUI") .statusBar(hidden: true) } }
//点击按钮切换状态栏隐藏、显示状态 struct ContentView: View { @State var hideStatusBar = false var body: some View { Button("状态栏切换") { self.hideStatusBar.toggle() } .statusBar(hidden: hideStatusBar) } }