TabView(页面样式)无法缩放以适应它的项目 swiftUI

Posted

技术标签:

【中文标题】TabView(页面样式)无法缩放以适应它的项目 swiftUI【英文标题】:TabView ( page style) does not scale to fit it's item swiftUI 【发布时间】:2021-12-26 19:01:30 【问题描述】:

我在移动应用程序上使用 tabView 作为滑动标题我有一个用于 tabItem 视图的对象、一个用于 TabView 的对象和另一个作为主视图的对象 问题是写在 mainView 上的对象没有足够的高度来显示 tabItems 宽。这是我写的代码:

//This code is used to make a view for tabItem
struct FeaturedItemView: View 
    // MARK: - PROPERTIES
    var player: Player
    
    var body: some View 
        Image(player.image)
            .resizable()
            .scaledToFit()
            .cornerRadius(12)
    


//This Code is used for create a view for TabView object
struct FeaturesTabView: View 
    // MARK: - PROPERTIES

    // MARK: - BODY
    var body: some View 
        TabView 
            ForEach(players)  player in
                FeaturedItemView(player: player)
                    .padding(.top, 10)
                    .padding(.horizontal, 15)
                    
            //: FOREACH
        //: TABVIEW
        .tabViewStyle(.page)
        .indexViewStyle(.page(backgroundDisplayMode: .always))
    

//This is the mainView
struct ContentView: View 
  
  // MARK: - BODY
    var body: some View 
        ZStack 
            VStack(alignment: .center, spacing: 10) 
                NavigationBarView()
                    .padding(.horizontal, 15)
                    .padding(.bottom)
                    .padding(.top, UIApplication.shared.windows.first?.safeAreaInsets.top)
                    .background(Color.white)
                    .shadow(color: Color.black.opacity(0.05), radius: 5, x: 0, y: 5)
                
                ScrollView(.vertical, showsIndicators: false) 
                    VStack(spacing: 0) 
                        // The issue is occurred here
                        // ******************
                        FeaturesTabView()
                            .padding(.vertical, 20)
                        //****************

                        FooterView()
                            .padding(.horizontal)
                    //: VSTACK
                    
                //: SCROLL
                
            //: VSTACK
            .background(colorBackground.ignoresSafeArea(.all, edges: .all))
        
        .ignoresSafeArea(.all, edges: .top)
    


显示的视图如下所示:

但预期的视图如下:

【问题讨论】:

【参考方案1】:

问题是您的FeaturesTabView 在没有.frame 的情况下在ScrollView 中崩溃。为了使其具有适应性,请将GeometryReader 放在您的视图上,然后将您的.frame() 设置为您希望它占据的屏幕的任何部分。例如,我给了它屏幕高度的 1/3。因为.scaledToFit(),图像会扩大它的宽度以保持在屏幕上的比例,所以你不需要在框架上设置宽度。

struct ContentView: View 
  
  // MARK: - BODY
    var body: some View 
        GeometryReader  geometry in
            ZStack 
                VStack(alignment: .center, spacing: 10) 
                     NavigationBarView()
                         .padding(.horizontal, 15)
                         .padding(.bottom)
                         .padding(.top, UIApplication.shared.windows.first?.safeAreaInsets.top)
                         .background(Color.white)
                         .shadow(color: Color.black.opacity(0.05), radius: 5, x: 0, y: 5)
                
                      ScrollView(.vertical, showsIndicators: false) 
                          VStack(spacing: 0) 
                            // Put a frame on your view to prevent it from collapsing in the ScrollView
                             FeaturesTabView()
                               .padding(.vertical, 20)
                               .frame(width: geometry.size.width, height: geometry.size.height / 3)

                            FooterView()
                               .padding(.horizontal)
                       //: VSTACK
                    
                   //: SCROLL
                
               //: VSTACK
               .background(colorBackground.ignoresSafeArea(.all, edges: .all))
           
           .ignoresSafeArea(.all, edges: .top)
        //: GEOMETRYREADER
    

【讨论】:

感谢您的回答@Yrb,问题是我无法根据整个滚动视图高度定义 FeaturesTabView 高度大小,因为滚动视图高度将是动态的,它将通过添加项目来更改。我必须将 FeaturesTabView 的大小设置为 FeaturedItemView 的大小,以适应它的大小。 这是一个ScrollView。它存在的全部原因是包含比屏幕上显示的更多的信息。如果您希望FeaturesTabView 以特定大小显示,您将不得不给它那个大小。我做了一个 1/3 的例子,但是你可以随意设置它。

以上是关于TabView(页面样式)无法缩放以适应它的项目 swiftUI的主要内容,如果未能解决你的问题,请参考以下文章

TabView 中的奇怪图像行为:图像无法缩放

使用 AutoLayout 缩放 UIImageView 以适应宽度

自动缩放 TextView 文本以适应范围 - 如何调用?

Vue-cli 3.x 中实现页面等比缩放(postcss-px2rem)

如何设置图像的 CSS 样式以适应引导宽度

LVGL v8学习笔记 | 10 - Tabview控件的使用方法