奇怪的 UI 在 iOS 14 上出现奇怪的渲染问题,当一个按钮被放置在一个部分 header/footer
Strange UI rendering problem on iOS 14 when a button is placed on a section header/footer
在下面的示例代码中,一个按钮被放置在 (form-) 部分 header,只要按下它就会切换 sheet。 sheet 有一个要显示的元素列表。
import SwiftUI
struct ContentView: View {
var body: some View {
VStack{
Form{
Section(header: headerView()) {
Text("Some Text")
}
}
}
}
}
struct headerView: View {
@State var showSheet = false
var body: some View {
Button(action: { self.showSheet.toggle()}){
HStack{
Spacer()
Image(systemName: "pencil.and.ellipsis.rectangle")
Text("View Sheet")
}
}.sheet(isPresented: $showSheet) {sheetView()}
}
}
struct sheetView: View {
@Environment(\.presentationMode) private var presentationMode
var body: some View {
NavigationView{
VStack(alignment: .leading) {
List() {
Text("List element 1")
Text("List element 2")
Text("List element 3")
Text("List element 4")
}
}
.navigationBarTitle(Text("Logs"), displayMode: .inline)
.navigationBarItems(leading: EditButton(), trailing: Button(action: {self.presentationMode.wrappedValue.dismiss()}) { Text("Done").bold()})
}
}
}
这在 iOS 13 上运行得很好。但是,在 iOS 14 中,正如您在下面的屏幕截图中看到的那样,它呈现完全损坏:
- 列表元素有奇怪的字体大小、颜色并且在 upper-case 中(最重要的一个!)
- NavigationBar 按钮是灰色的并且在 upper-case
- NavigationBar 标题在 upper-case
只要您不触摸屏幕,损坏的行为就会一直存在。当您触摸屏幕并将 sheet 向下拖动一点点时,列表就会出现外观将得到纠正。如果您对 NavigationBar 执行相同的操作,它也会正确呈现。
有人也遇到这个问题吗?任何已知的修复程序?
这看起来像是一个错误。可能的解决方法是将 sheet 移出 Form.
测试 Xcode 12.0 / iOS 14.
struct ContentView: View {
@State var showSheet = false
var body: some View {
VStack{
Form{
Section(header:
headerView(showSheet: $showSheet)
) {
Text("Some Text")
}
}
}.sheet(isPresented: $showSheet) {sheetView()}
}
}
struct headerView: View {
@Binding var showSheet: Bool
var body: some View {
Button(action: { self.showSheet.toggle()}){
HStack{
Spacer()
Image(systemName: "pencil.and.ellipsis.rectangle")
Text("View Sheet")
}
}
}
}
在下面的示例代码中,一个按钮被放置在 (form-) 部分 header,只要按下它就会切换 sheet。 sheet 有一个要显示的元素列表。
import SwiftUI
struct ContentView: View {
var body: some View {
VStack{
Form{
Section(header: headerView()) {
Text("Some Text")
}
}
}
}
}
struct headerView: View {
@State var showSheet = false
var body: some View {
Button(action: { self.showSheet.toggle()}){
HStack{
Spacer()
Image(systemName: "pencil.and.ellipsis.rectangle")
Text("View Sheet")
}
}.sheet(isPresented: $showSheet) {sheetView()}
}
}
struct sheetView: View {
@Environment(\.presentationMode) private var presentationMode
var body: some View {
NavigationView{
VStack(alignment: .leading) {
List() {
Text("List element 1")
Text("List element 2")
Text("List element 3")
Text("List element 4")
}
}
.navigationBarTitle(Text("Logs"), displayMode: .inline)
.navigationBarItems(leading: EditButton(), trailing: Button(action: {self.presentationMode.wrappedValue.dismiss()}) { Text("Done").bold()})
}
}
}
这在 iOS 13 上运行得很好。但是,在 iOS 14 中,正如您在下面的屏幕截图中看到的那样,它呈现完全损坏:
- 列表元素有奇怪的字体大小、颜色并且在 upper-case 中(最重要的一个!)
- NavigationBar 按钮是灰色的并且在 upper-case
- NavigationBar 标题在 upper-case
只要您不触摸屏幕,损坏的行为就会一直存在。当您触摸屏幕并将 sheet 向下拖动一点点时,列表就会出现外观将得到纠正。如果您对 NavigationBar 执行相同的操作,它也会正确呈现。
有人也遇到这个问题吗?任何已知的修复程序?
这看起来像是一个错误。可能的解决方法是将 sheet 移出 Form.
测试 Xcode 12.0 / iOS 14.
struct ContentView: View {
@State var showSheet = false
var body: some View {
VStack{
Form{
Section(header:
headerView(showSheet: $showSheet)
) {
Text("Some Text")
}
}
}.sheet(isPresented: $showSheet) {sheetView()}
}
}
struct headerView: View {
@Binding var showSheet: Bool
var body: some View {
Button(action: { self.showSheet.toggle()}){
HStack{
Spacer()
Image(systemName: "pencil.and.ellipsis.rectangle")
Text("View Sheet")
}
}
}
}