在日常的SwiftUI
开发过程中,常常会出现一些“小BUG”让咱们措手不及、头顶发凉。这些问题可能是因为咱们自己不熟悉SwiftUI
语法导致的,也有是SwiftUI
本身自带的缺陷,毕竟是一个新式语言。
那么本章就介绍一些SwiftUI
开发的小技巧,协助咱们避避那些让咱们头秃的坑。
1、怎么在List列表视图去掉分割线LineSeparator?
SwiftUI
中的List
能够说是UIKit中TableView
的进化版本,在UIKit
中咱们运用separatorColor
修饰符将分割线的款式改为无。示例:
tableView.separatorColor = .clear
在SwiftUI
中运用的办法相似,SwiftUI
中的List
的底层运用的是UITableView
,咱们能够调用AppearanceAPI
来完成去掉分割线款式。示例:
UITableView.appearance().separatorColor = .clear
但是,运用这种办法会导致App
中一切的List
,包含其他页面的的List
也会主动去掉分割线,这是因为UITableView
是List
的底层,咱们的修饰符是作用在UITableView上的。
往后咱们要在其他页面,比方设置页面,要康复分割线,咱们就需要赋予分割线的款式。示例:
UITableView.appearance().separatorColor = .systemGray4
2、怎么在List列表视图躲藏箭头?
在UIKit
中,咱们运用accessoryType
修饰符来禁用disclosure
指示器,也就是右侧的箭头。示例:
cell.accessoryType = .none
在SwiftUI
中,十分惋惜的是,Apple
没有供给专门的API
来设置躲藏disclosure
指示器,这会有点麻烦。
咱们建立一个List
列表来看看,当咱们运用NavigationLink
跳转到DetailView
详情页时,体系就会主动展现右侧的箭头,示例:
那么咱们试试自己来完成躲藏disclosure
指示器。
struct ContentView: View {
var body: some View {
NavigationView {
List {
ForEach(1 ... 4, id: \.self) { index in
ZStack(alignment: .leading) {
NavigationLink(
destination: DetailView()) {
}
.opacity(0)
Text("第 \(index)页")
}
}
}.navigationTitle("列表")
}
}
}
上述代码中,咱们运用ZStack
层叠视图将整个NavigationLink
的视图包裹起来,然后运用opacity
修饰符把disclosure
指示器躲藏。
看起来不错!
3、怎么修正整个视图的布景色彩?
在List
列表中,因为咱们运用SwiftUI
自带的列表组件,它会默认给整个视图填充一个布景色彩以凸显列表,这时咱们追求页面整体性时,需要给List
视图加一个布景色彩。
在UIKit
中,咱们能够直接给视图加布景色彩,示例:
view.backgroundColor = UIColor.colorF6F7FB()
首要,咱们要去掉原有的List
列表色彩,示例:
init() {
UITableView.appearance().backgroundColor = .clear
}
然后在事务代码中,咱们能够运用ZStack
层叠视图和Color
的办法设置List
的布景色彩,示例:
Color(red: 132.0 / 255.0, green: 161.0 / 255.0, blue: 255.0 / 255.0).edgesIgnoringSafeArea(.all)
不错不错!
4、怎么经过网络请求显现一张网络图片?
在常用的设置页面或许我的页面,会运用到用户头像等作为用户登录示例,除了运用第三方网络请求框架外,咱们也能够运用SwiftUI
自带的网络图片组件,示例:
AsyncImage(url: URL(string: imageURL))
.aspectRatio(contentMode: .fit)
.frame(minWidth: 120, maxWidth: 120, minHeight: 120, maxHeight: 120)
.cornerRadius(8)
上述代码中,咱们只需要界说一个图片的网络地址,就能够运用AsyncImage
组件呈现一张图片出来,并且AsyncImage
和Image
一样,能够运用修饰符修正巨细的参数。
5、怎么制作带有边角的图形?
在SwiftUI
开发过程中,咱们常常会看到一些带有部分圆角的形状,这又是怎么完成的呢?
咱们能够经过图片的办法展现,也能够自己根据形状制作,下面咱们测验运用Shape
形状来完成这个效果。示例:
struct CShape: Shape {
func path(in rect: CGRect) -> Path {
let path = UIBezierPath(
roundedRect: rect,
byRoundingCorners: [.topRight, .bottomLeft],
cornerRadii: CGSize(width: 55, height: 55)
)
return Path(path.cgPath)
}
}
上述代码中,咱们制作了一个形状CShape
结构体,在结构体中咱们的界说了一个办法path
,它回来一个Path
路径。
咱们运用贝塞尔曲线UIBezierPath
进行制作,在右上topRight
和左下bottomLeft
制作曲率。
接下来咱们在视图中运用,示例:
struct CShapeView: View {
var body: some View {
Rectangle()
.fill(LinearGradient(gradient: Gradient(colors: [Color.blue, Color.green]), startPoint: .leading, endPoint: .trailing))
.frame(width: 100, height: 100)
.clipShape(CShape())
}
}
上述代码中,咱们制作了一个矩形Rectangle
,给它填充了一个蓝色过渡到绿色的渐变色,然后设置了巨细为100*100
。
最终咱们运用clipShape
修饰符切开曲线,切开办法为上面设置好的CShape
。
这样,咱们就完成了一个相似叶子效果的带边角的形状。
6、怎么制作虚线边框?
在新版的Xcode
中,咱们已经不能直接运用border
修饰符给按钮加边框了,那咱们该怎么给按钮加边框线呢?
其实很简单,咱们能够运用overlay
修饰符在按钮上掩盖一层边框,示例:
Text("文如秋雨")
.font(.title)
.foregroundColor(.blue)
.padding()
.overlay(
RoundedRectangle(cornerRadius: 30)
.stroke(Color(.systemGray5), lineWidth: 2)
)
上述代码中,咱们运用overlay
掩盖了一层圆角矩形RoundedRectangle
,圆角度数为30
,并且运用stroke
修饰符给圆角赋予了一个灰色systemGray5
,和2
的线宽。
这是边框的完成办法,那么虚线边框咱们运用的是Capsule
容器。示例:
Text("文如秋雨")
.font(.title)
.foregroundColor(.blue)
.padding()
.overlay(
Capsule(style: .continuous)
.stroke(Color.blue, style: StrokeStyle(lineWidth: 2, dash: [10]))
)
上述代码中,咱们掩盖的是Capsule
容器,然后将Capsule
容器的款式指定为StrokeStyle
,StrokeStyle
款式中线宽为2
,线段间距为10
。
如此,咱们便完成了制作一个虚线边框。
7、怎么共享文本和图片?
在实践的开发应用中,咱们常常会在App
中运用共享操作,将某一段文字或许图片共享出去,这是怎么完成的呢?
首要咱们先完成共享的办法,示例:
struct ShareSheet: UIViewControllerRepresentable {
var items: [Any]
func makeUIViewController(context: Context) -> UIActivityViewController {
let controller = UIActivityViewController(activityItems: items, applicationActivities: nil)
return controller
}
func updateUIViewController(_ uiViewController: UIActivityViewController, context: Context) {
}
}
上述代码中,咱们创建了一个ShareSheet
结构体,它遵从UIViewControllerRepresentable
协议。
咱们声明了一个items
变量是随机类型,便于后续咱们存储不同类型的内容。然后界说了一个办法makeUIViewController
,调用体系的UIActivityViewController
视图办法,共享声明好的items
内容。
接下来,咱们来完成视图部分,示例:
struct ShareLinkView: View {
let items = ["https:///user/3897092103223517"]
@State var showingSheet: Bool = false
var body: some View {
HStack {
Image(systemName: "square.and.arrow.up")
Text("共享")
}
.onTapGesture {
showingSheet.toggle()
}
.sheet(isPresented: $showingSheet) {
ShareSheet(items: items)
}
}
}
上述代码中,咱们声明了一个常量,存储咱们的网站地址,然后运用Image
和Text
创建了一个共享的款式,调用sheet
弹窗办法打开弹窗,弹窗的内容为咱们声明好的ShareSheet
视图,然后将声明好的内容传入进行共享。效果如下:
8、怎么在按钮点击时有震动反应?
iOS
很杰出的一点是它的线性马达
所带来的反应体验,让咱们在点击屏幕某些操作时能够接收到App
供给的反应信息。
假如咱们需要给App
的某些操作参加一些震动反应,该怎么完成?
咱们能够运用UINotificationFeedbackGenerator
来完成震动反应的效果,示例:
struct Haptics {
static func hapticSuccess() {
let generator = UINotificationFeedbackGenerator()
generator.notificationOccurred(.success)
}
static func hapticWarning() {
let generator = UINotificationFeedbackGenerator()
generator.notificationOccurred(.warning)
}
}
上述代码中,咱们创建了一个结构体Haptics
,在Haptics
中界说了2
个震动反应效果,一个时成功反应,一个是失利反应。
然后咱们在实践事务视图中运用它,示例:
struct HapticsView: View {
var body: some View {
VStack(spacing:40) {
Text("成功时的反应")
.padding()
.foregroundColor(.white)
.background(Color.green)
.cornerRadius(5)
.onTapGesture {
Haptics.hapticSuccess()
}
Text("失利时的反应")
.padding()
.foregroundColor(.white)
.background(Color.gray)
.cornerRadius(5)
.onTapGesture {
Haptics.hapticWarning()
}
}
}
}
上述代码中,咱们创建了2
个按钮,分别赋予了不同的款式,当咱们点击按钮
时,会调用震动反应的办法,从而完成让用户有点击的效果。
震动反应常用在长按或许一些警告事务场景中,能够视状况而运用。
小结
好啦!这就是本章的一切内容,是不是有点眼前一亮呢?
你还知道有哪些SwiftUI
小技巧,不妨共享一下。
假如本专栏对你有协助,不妨点赞、评论、关注~
我正在参与技能社区创作者签约方案招募活动,点击链接报名投稿。