现在SwiftUI还不完善,而且实际运用还会存在一些缺陷。网上的教程现在还很少,有也是收费的。因而特别收拾一些平常开发中遇到的问题,免费提供给读者。
(注:本文首要面向对SwiftUI有必定基础的读者,转载请注明出处。)
调整状况栏款式 StatusBarStyle
尝试Info.plist
和UIApplication.statusBarStyle
办法无效。如果有UIViewController
作为根视图,重写办法preferredStatusBarStyle
,这样能够操控全局;如果要设置单个页面的款式用preferredColorScheme(.light)
,但测验好像设置无效。还有另一个办法:stackoverflow.com/questions/5…
调整导航栏款式 NavigationBar
let naviAppearance = UINavigationBarAppearance()
naviAppearance.configureWithOpaqueBackground() // 不透明布景款式
naviAppearance.backgroundColor = UIColor.whiteColor // 布景色
naviAppearance.shadowColor = UIColor.whiteColor // 阴影色
naviAppearance.titleTextAttributes = [:] // 标题款式
naviAppearance.largeTitleTextAttributes = [:] // 大标题款式
UINavigationBar.appearance().standardAppearance = naviAppearance
UINavigationBar.appearance().compactAppearance = naviAppearance
UINavigationBar.appearance().scrollEdgeAppearance = naviAppearance
UINavigationBar.appearance().tintColor = UIColor.blackColor // 导航栏按钮色彩
留意configureWithOpaqueBackground()
需求在其它特点设置之前调用,除此之外还有透明布景configureWithTransparentBackground()
,设置布景模糊作用backgroundEffect()
,布景和阴影图片等,以及导航栏按钮款式也可修正。
调整标签栏款式 TabBar
let itemAppearance = UITabBarItemAppearance()
itemAppearance.normal.iconColor = UIColor.whiteColor // 正常状况的图标色彩
itemAppearance.normal.titleTextAttributes = [:] // 正常状况的文字款式
itemAppearance.selected.iconColor = UIColor.whiteColor // 选中状况的图标色彩
itemAppearance.selected.titleTextAttributes = [:] // 选中状况的文字款式
let tabBarAppearance = UITabBarAppearance()
tabBarAppearance.configureWithOpaqueBackground() // 不透明布景款式
tabBarAppearance.stackedLayoutAppearance = itemAppearance
tabBarAppearance.backgroundColor = UIColor.whiteColor // 布景色
tabBarAppearance.shadowColor = UIColor.clear // 阴影色
UITabBar.appearance().standardAppearance = tabBarAppearance
留意configureWithOpaqueBackground()
相同需求在其它特点设置之前调用,和UINavigationBarAppearance
一样有相同的设置,除此之外还能够为每个标签项设置指示器外观。
标签视图 TabView
设置默许选中页面:办法如下,一起每个标签项需求设置索引值tag()
TabView(selection: $selectIndex, content: {})
操控底部标签栏显现和隐藏:
UITabBar.appearance().isHidden = true
NavigationView与TabView结合运用时,进入子页面TabBar不消失问题:不用默许的TabBar,将其隐藏,自己手动完成一个TabBar,放在根视图中。
(转载请注明出处:https:///post/7037780197076123685
)
键盘
输入框取得焦点(弹出键盘):在iOS15上增加了办法focused()
,留意这个办法在视图初始化时是无效的,需求在onAppear()
中推迟必定时间调用才能够。在此之前的系统只能自定义控件的办法完成参考这个:stackoverflow.com/questions/5…
关闭键盘,两种办法都能够:
UIApplication.shared.keyWindow?.endEditing(true)
UIApplication.shared.sendAction(#selector(UIResponder.resignFirstResponder), to: nil, from: nil, for: nil)
增加键盘工具栏:
.toolbar()
手势
取得按下和松开的状况:
.simultaneousGesture(
DragGesture(minimumDistance: 0)
.onChanged({ _ in })
.onEnded({ _ in })
)
通过代码翻滚ScrollView到指定方位:凭借ScrollViewReader
能够获取方位,在onAppear()
中设置方位scrollTo()
,我们实际运用发现,需求做个推迟履行才会有效,能够把履行放在DispatchQueue.main.async()
中履行。
TextEditor
修正布景色:
UITextView.appearance().backgroundColor
处理Return键完毕编辑:
.onChange(of: text) { value in
if value.last == "\n" {
UIApplication.shared.keyWindow?.endEditing(true)
}
}
Text文本内部对齐方式
multilineTextAlignment(.center)
(转载请注明出处:https:///post/7037780197076123685
)
页面跳转
容易犯错的情况:开发中会常常遇到这样的需求,列表中选择一项,进入子页面。点击按钮返回上一页。此刻再次点击列表中的某一项,会发现显现的页面内容是过错的。如果你是用NavigationLink
做页面跳转,并传递了isActive
参数,那么是会遇到这样的问题。原因在于多个页面的运用的是同一个isActive
参数。解决办法是,列表中每一项都用独立的变量操控。NavigationView
也尽量不要写在TabView
外面,可能会导致不可思议的问题。
特点包装器在init中的初始化
init办法中直接赋值会发现无法成功,应该用特点包装器自身的办法包装起来,赋值的特点名前加_
,例如:
_value = State<Int>(initialValue: 1)
_value = Binding<Bool>.constant(true) // 也能够运用Swift语法特性直接写成.constant(true)
View怎么忽略触摸事情
allowsHitTesting(false)