看起来在当前的工具/系统中,刚刚发布的 Xcode 11.4/iOS 13.4 中将没有 SwiftUI 原生支持“滚动到”功能List。因此,即使他们,Apple,将在下一个主要版本中提供它,我也需要对 iOS 13.x 的向后支持。
那么我将如何以最简单和轻松的方式做到这一点?
(我不喜欢像之前在 SO 上提出的那样将完整的UITableView基础设施包装起来UIViewRepresentable/UIViewControllerRepresentable)。
TextField我的主箱里有七个ContentView。当用户打开键盘时,其中一些TextField隐藏在键盘框架下。所以TextField当键盘出现时,我想分别向上移动。
我已使用以下代码TextField在屏幕上添加。
struct ContentView : View {
@State var textfieldText: String = ""
var body: some View {
VStack {
TextField($textfieldText, placeholder: Text("TextField1"))
TextField($textfieldText, placeholder: Text("TextField2"))
TextField($textfieldText, placeholder: Text("TextField3"))
TextField($textfieldText, placeholder: Text("TextField4"))
TextField($textfieldText, placeholder: Text("TextField5"))
TextField($textfieldText, placeholder: Text("TextField6"))
TextField($textfieldText, placeholder: Text("TextField6"))
TextField($textfieldText, placeholder: Text("TextField7"))
}
}
}
Run Code Online (Sandbox Code Playgroud)
输出:
我正在尝试重新创建Twitter iOS应用的一部分以学习SwiftUI,并且想知道如何动态地将一个视图的宽度更改为另一视图的宽度。就我而言,使下划线与“文本”视图的宽度相同。
我已附上屏幕截图,以尝试更好地解释我的意思。任何帮助将不胜感激,谢谢!
这也是我到目前为止的代码:
import SwiftUI
struct GridViewHeader : View {
@State var leftPadding: Length = 0.0
@State var underLineWidth: Length = 100
var body: some View {
return VStack {
HStack {
Text("Tweets")
.tapAction {
self.leftPadding = 0
}
Spacer()
Text("Tweets & Replies")
.tapAction {
self.leftPadding = 100
}
Spacer()
Text("Media")
.tapAction {
self.leftPadding = 200
}
Spacer()
Text("Likes")
}
.frame(height: 50)
.padding(.horizontal, 10)
HStack {
Rectangle()
.frame(width: self.underLineWidth, height: 2, alignment: .bottom)
.padding(.leading, leftPadding)
.animation(.basic())
Spacer()
}
} …Run Code Online (Sandbox Code Playgroud) 我试图将多个单元格彼此相邻放置,其中每个单元格由下面的图像和文本组成。单元格本身应该是一个正方形,并且应该缩放图像以填充剩余空间(剪切图像的一部分)。
首先,我尝试将图像和下面的文字制作成正方形。现在我的问题是,我不知道如何在 SwiftUI 中正确实现。使用此代码时,我可以让它工作:
VStack {
Image(uiImage: recipe.image!)
.resizable()
.aspectRatio(contentMode: .fill)
.frame(width: 200, height: 200, alignment: .center)
.clipped()
Text(recipe.name)
}
Run Code Online (Sandbox Code Playgroud)
问题是,我必须指定一个固定的帧大小。我想要的是一种制作单元格的方法,它保持 1:1 的纵横比并且可以调整大小,因此我可以将它们的动态数量放在彼此相邻的屏幕上。
我也尝试使用
VStack {
Image(uiImage: recipe.image!)
.resizable()
.aspectRatio(1.0, contentMode: .fit)
.clipped()
Text(recipe.name)
}
Run Code Online (Sandbox Code Playgroud)
这给了我方形图像,动态缩放。但问题是,图像现在被拉伸以填充正方形而不是缩放以填充它。
我的下一个想法是把它剪成方形。为此,我首先尝试将其剪成圆形(因为显然没有方形):
VStack {
Image(uiImage: recipe.image!)
.resizable()
.aspectRatio(1.0, contentMode: .fit)
.clipped()
Text(recipe.name)
}
Run Code Online (Sandbox Code Playgroud)
但是出于某种奇怪的原因,它并没有真正剪辑图像,而是保留了剩余的空间......
那么我是不是没有看到任何东西,或者是将图像裁剪成框架修改器的唯一选项?
澄清:我不太关心文本,因为整个单元格(或者图像更简单)是方形的,无需通过.frame非方形原始图像指定其大小,也无需拉伸非方形原始图像以使其成为合身。
所以完美的解决方案是 VStack 是方形的,但获得方形图像也可以。它应该看起来像图像 1,但不必使用.frame修饰符。
我看到了 position 属性,但我认为它只是用来设置 x 和 y 的,但我不知道如何识别当前位置。
或者完全如何使用像 onHover 这样的事件收入属性?
我正在尝试在SwiftUI中创建像这样的视差标头效果https://twitter.com/KhaosT/status/1140814602017464320,但是我真的不知道如何在滚动时获取列表的内容偏移量。
有谁知道滚动时如何计算列表的内容偏移量?
有没有什么方法可以使用 SwiftUI 查找父视图大小,我查看了文档和示例,似乎大多数(如果不是全部)都是硬编码大小,理想情况下我想找到父视图的大小,然后设置子视图大小基于父视图大小的百分比(可能在某些快速助手类或其他类中)例如
func getSizeFromParent(fractionHeight: Int, fractionWidth: Int) -> Size
{
var parentSize = // is there a way to get parent size somehow
var newHeight = parentSize.height * fractionHeight
var newWidth = parentSize.width * fractionWidth
return Size(newHeight, newWidth)
}
Run Code Online (Sandbox Code Playgroud)
请注意,上面的代码并不是一个工作示例,只是伪代码
我开始探索SwiftUI,却找不到一种简单的方法:我希望View具有成比例的高度(基本上是其父代高度的百分比)。假设我有3个垂直堆叠的视图。我想要:
我从WWDC19观看了这个有趣的视频,它介绍了SwiftUI中的自定义视图(https://developer.apple.com/videos/play/wwdc2019/237/),并且我理解(如果我错了,请纠正我)基本上从不使用View本身具有大小,大小是其子代的大小。因此,父视图询问其子项的高度。他们的回答是:“身高减半!” 然后什么?布局系统(与我们以前使用的布局系统不同)如何处理这种情况?
如果您编写以下代码:
struct ContentView : View {
var body: some View {
VStack(spacing: 0) {
Rectangle()
.fill(Color.red)
Rectangle()
.fill(Color.green)
Rectangle()
.fill(Color.yellow)
}
}
}
Run Code Online (Sandbox Code Playgroud)
SwiftUI布局系统将每个视图的大小设置为1/3高,根据我上面发布的视频,这是正确的。您可以通过以下方式将矩形包装在框架中:
struct ContentView : View {
var body: some View {
VStack(spacing: 0) {
Rectangle()
.fill(Color.red)
.frame(height: 200)
Rectangle()
.fill(Color.green)
.frame(height: 400)
Rectangle()
.fill(Color.yellow)
}
}
}
Run Code Online (Sandbox Code Playgroud)
这样,布局系统将第一个矩形的尺寸设置为200高,第二个矩形的尺寸设置为400高,第三个矩形的尺寸适合所有剩余空间。再说一次,这很好。您不能(以这种方式)指定比例高度。