【问题标题】:Xcode Preview canvas different then SimulatorXcode Preview canvas 不同于 Simulator
【发布时间】:2021-10-31 03:34:36
【问题描述】:

我目前正在开发一个应用程序,并且我正在尝试将视图设置为针对不同的屏幕尺寸准确。我在预览中得到了我想要的设计,但是当我在模拟器中运行它时,有些东西有点不对劲。请注意,并非所有屏幕都这样做,只有少数。这可能是什么原因?

截图供参考:Xcode/Simulator Screenshot

内容视图:

struct ContentView: View {
//Removed variables for checking log ins and loading screen animation
var body: some View {
    VStack{
        //Check if logged in and not first time
        if status && !firstTime{
            ZStack{
                NavigationView{
                    TabView(){
                        Tab1View()
                            .environmentObject(ContentViewModel())
                        Tab2View()
                            .environmentObject(ContentViewModel())
                    }
                    .navigationBarHidden(true)
                    .tabViewStyle(PageTabViewStyle(indexDisplayMode: .never))
                }
                ZStack{
                  //LoadingScreen
                }
                .ignoresSafeArea(edges: .all)
                .onAppear(perform: animateSplash)
                .opacity(endSplash ? 0 : 1)
            }
        } 
          //Check if logged and first time
          else if status && firstTime{
            ZStack{
                NavigationView{
                    if role == "owner"{
                        WelcomeView()
                    } else {
                        WelcomeEmployeeView()
                    }
                }
            }
        } else {
           NavigationView{
              //View in the screenshot
              CreateView()
           }
        }
    }

创建视图:

import SwiftUI
import FirebaseAuth

struct CreateView: View {

@EnvironmentObject var model: ContentViewModel
@State var companyName = ""
@State var employeeName = ""
@State var phoneNumber = ""
@State var show = false
@State var message = ""
@State var alert = false
@State var ID = ""
@State var test = ""
@State var role = "owner"

var body: some View {
    
    ZStack{
        ZStack(alignment: .topTrailing){
            Path{ path in
                path.move(to: CGPoint(x: 500, y: 0))
                path.addLine(to: CGPoint(x: 0, y: 0))
                path.addLine(to: CGPoint(x: 0, y: 80))
                path.addLine(to: CGPoint(x:500, y: 180))
            }
            .fill(LinearGradient(gradient:Gradient(colors: [Color(#colorLiteral(red: 0.6470588235, green: 0.8196078431, blue: 0.7450980392, alpha: 1)), Color(#colorLiteral(red: 0.2549019608, green: 0.7607843137, blue: 0.8588235294, alpha: 1)), .white, .green]), startPoint: .topLeading, endPoint: .bottomTrailing))
            .edgesIgnoringSafeArea(.top)
            Image("icon-white")
                .resizable()
                .frame(width: 50, height: 60)
                .padding(.top)
                .padding(.trailing, 30)
        }
        
        VStack(alignment: .leading){
            Text("Create a")
                .foregroundColor(Color(#colorLiteral(red: 0.2549019608, green: 0.7607843137, blue: 0.8588235294, alpha: 1)))
                .font(.custom("Poppins-Medium", size: 30))
            Text("Company Account")
                .foregroundColor(Color(#colorLiteral(red: 0.2549019608, green: 0.7607843137, blue: 0.8588235294, alpha: 1)))
                .font(.custom("Poppins-Medium", size: 30))
                .padding(.bottom, 30)
                
            
            Text("Company Name")
                .foregroundColor(Color(#colorLiteral(red: 0.2549019608, green: 0.7607843137, blue: 0.8588235294, alpha: 1)))
                .font(.custom("Poppins-Semibold", size: 16))
            TextField("", text: $companyName)
                .frame(width: 290)
                .padding(14)
                .overlay(RoundedRectangle(cornerRadius: 5.0).strokeBorder(Color.black, style: StrokeStyle(lineWidth: 0.5)))
                .padding(.bottom)

            
            Text("Employee Name")
                .foregroundColor(Color(#colorLiteral(red: 0.2549019608, green: 0.7607843137, blue: 0.8588235294, alpha: 1)))
                .font(.custom("Poppins-Semibold", size: 16))
            TextField("", text: $employeeName)
                .frame(width: 290)
                .padding(14)
                .overlay(RoundedRectangle(cornerRadius: 5.0).strokeBorder(Color.black, style: StrokeStyle(lineWidth: 0.5)))
                .padding(.bottom)
            
            Text("Phone Number")
                .foregroundColor(Color(#colorLiteral(red: 0.2549019608, green: 0.7607843137, blue: 0.8588235294, alpha: 1)))
                .font(.custom("Poppins-Semibold", size: 16))
            TextField("", text: $phoneNumber)
                .frame(width: 290)
                .padding(14)
                .overlay(RoundedRectangle(cornerRadius: 5.0).strokeBorder(Color.black, style: StrokeStyle(lineWidth: 0.5)))
                .padding(.bottom)
            
            VStack(alignment: .center){
                
                NavigationLink(
                    destination: VerifcationView(show: $show, ID: $ID, name: $employeeName, companyName: $companyName, phoneNumber: $phoneNumber, hasCode: $test, role: $role), isActive: $show){
                    ZStack{
                        RoundedRectangle(cornerRadius: 5)
                            .foregroundColor(Color(#colorLiteral(red: 0.2549019608, green: 0.7607843137, blue: 0.8588235294, alpha: 1)))
                            .frame(width: 315,height: 50)
                        Button(action: {
                            PhoneAuthProvider.provider().verifyPhoneNumber( "+"+self.phoneNumber, uiDelegate:nil){ (ID, error) in
                                
                                if error != nil {
                                    self.message = (error?.localizedDescription)!
                                    self.alert.toggle()
                                    return
                                }
                                
                                self.ID = ID!
                                self.show.toggle()
                            }
                        }, label: {
                            Text("Create Account")
                                .font(.custom("Poppins-Medium", size: 18))
                                .foregroundColor(.white)
                        })
                        
                    }
                }
                NavigationLink(
                    destination: JoinView()){
                    Text("Join as Employee")
                        .foregroundColor(Color(red: 141/255, green: 141/255, blue: 141/255))
                        .underline(/*@START_MENU_TOKEN@*/true/*@END_MENU_TOKEN@*/, color: Color(red: 141/255, green: 141/255, blue: 141/255))
                }
            }
            .padding(.top)
        }
        .padding(.top)
        
    }
    .navigationBarBackButtonHidden(true)
  }
}

【问题讨论】:

  • 您可能将视图嵌入到您的模拟器运行的最终应用程序的另一个视图中。你能展示你的代码吗?
  • @aheze 遗憾的是,由于背景协议,我无法发布我的代码。但是您是正确的,它受到父视图的影响。我想我最好的办法是研究 GeometryReader 来解决这个问题?
  • 不,尽可能避免GeometryReader。另外,如果你能做一个minimal reproducible example,那真的很有帮助
  • @aheze 好的,我已经更新了 ContentView 的示例,如果需要也可以添加 CreateView 示例
  • statusfirstTimeContentViewModel 是什么?是的,如果可以,请添加CreateView

标签: ios swift xcode swiftui


【解决方案1】:

对于 SwiftUI 预览,您只需预览一个视图 - CreateView。这是预览的唯一视图。同时,您的模拟器运行整个应用程序,从您的ContentView 开始。

请注意,在ContentView 中,您将CreateView 包装在NavigationView 中。

NavigationView{
    // View in the screenshot
    CreateView()
}

这将在屏幕顶部添加一个间隙,将其他所有内容向下推(导致您看到的差异)。甚至icon-white 图像也被推到屏幕的白色部分,这就是为什么您在模拟器中看不到它的原因。

【讨论】:

  • 什么是仍然使用 NavigationView 并且不会将所有内容都向下推的最佳方法?
  • @Lowgy 你可以隐藏它:CreateView().navigationBarHidden(true).
  • 不知道我以前怎么没有意识到这一点。感谢您的帮助!
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2013-05-26
  • 2011-06-12
  • 1970-01-01
  • 1970-01-01
  • 2012-10-09
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多