使用 SwiftUI 在 WatchOS 中适配 UI

Posted

技术标签:

【中文标题】使用 SwiftUI 在 WatchOS 中适配 UI【英文标题】:Fit UI in WatchOS using SwiftUI 【发布时间】:2019-08-16 13:49:59 【问题描述】:

我正在努力掌握如何使用 SwiftUI 为 Watch App 构建合适的 UI

我所说的拟合是指我想创建一个无需滚动即可显示一些信息的屏幕。

UI 应该适应屏幕大小并适合 UI 元素,我还希望能够在空间不足时删除低优先级的 UI 元素。

我尝试创建一个文本元素的示例 VStack,然后使用 layoutPriority(...).minimumScaleFactor(...) 等属性让内容适合容器,但没有运气。

给出以下代码。我在屏幕上看到的结果是一个溢出可用空间的大文本列表。不管我使用什么layoutPriority(...) /.minimumScaleFactor(...) 方法组合

struct ContentView: View 
    var body: some View 
        VStack() 
            Text("Hello World").font(.title)
            Text("Hello World").font(.title)
            Text("Hello World").font(.title)
            Text("Hello World").font(.title)
            Text("Hello World").font(.title)
            Text("Hello World").font(.title)
            Text("Hello World").font(.title)
        
    

结果是:

在 swiftUI 中有没有办法构建一个合适的 UI,可以缩放内容以适应可用空间,而不仅仅是中继包含的 View 想要使用的空间?如果可用空间不够,还有没有办法删除 UI 元素?

【问题讨论】:

【参考方案1】:

使用GeometryReader,您可以获得与其父布局相比灵活的首选尺寸。

这个视图返回一个灵活的首选尺寸给它的父布局。

struct ContentView: View 

    var arr = ["Hello World 1",
               "Hello World 2",
               "Hello World 3",
               "Hello World 4",
               "Hello World 5",
               "Hello World 6",
               "Hello World 7",
               "Hello World 8",
               "Hello World 9"]

    var body: some View 
        GeometryReader  geometry in
                VStack(alignment: .leading) 
                    Group 
                        ForEach(self.arr, id:\.self) text in
                                Text(text)
                         
                        .lineLimit(nil)
                        .frame(height: geometry.size.height/CGFloat(self.arr.count))
                        .font(.custom("HelvaticaNeue", size: 20.0))
                 
             .edgesIgnoringSafeArea(.bottom)

     

【讨论】:

以上是关于使用 SwiftUI 在 WatchOS 中适配 UI的主要内容,如果未能解决你的问题,请参考以下文章

在 SwiftUI 中隐藏 Picker 在 watchOS 上的焦点边界

在watchOS中使用.listRowBackground时如何将cornerRadius添加到SwiftUI List Cell?

SwiftUI:在 Tabview 的 WatchOS 8.1RC 上立即弹出 NavigationLink

为啥 EmptyView() 不能在带有 SwiftUI 的 WatchOS 上工作?

SwiftUI PresentationButton 在 watchOS 上单次使用后停止运行

WatchOS SwiftUI 动画视图调整父级大小