将 lineBreakMode 设置为 byWordWrapping 并将 numberOfLines 设置为 0 似乎还不够:
struct MyTextView: UIViewRepresentable {
func makeUIView(context: Context) -> UILabel {
let label = UILabel()
label.lineBreakMode = .byWordWrapping
label.numberOfLines = 0
label.text = "Here's a lot of text for you to display. It won't fit on the screen."
return label
}
func updateUIView(_ view: UILabel, context: Context) {
}
}
struct MyTextView_Previews: PreviewProvider {
static var previews: some View {
MyTextView()
.previewLayout(.fixed(width: 300, height: 200))
}
}
Run Code Online (Sandbox Code Playgroud)
无论我对 lineBreakMode 使用哪种设置,文本都不会换行。画布预览和实时预览都如下所示:
我得到的最接近的是设置 preferredMaxLayoutWidth,这确实会导致文本换行,但似乎没有一个值表示“无论视图大小如何”。
我正在尝试建立登录视图时正在探索SwiftUI,现在我遇到了问题
这是我要实现的目标:
如您所见,我已经达到了这一点,但是我不喜欢我的实现
struct ContentView : View {
@State var username: String = ""
var body: some View {
VStack(alignment: .leading) {
Text("Login")
.font(.title)
.multilineTextAlignment(.center)
.lineLimit(nil)
Text("Please")
.font(.subheadline)
HStack {
VStack (alignment: .leading, spacing: 20) {
Text("Username: ")
Text("Password: ")
}
VStack {
TextField($username, placeholder: Text("type something here..."))
.textFieldStyle(.roundedBorder)
TextField($username, placeholder: Text("type something here..."))
.textFieldStyle(.roundedBorder)
}
}
}.padding()
}
}
Run Code Online (Sandbox Code Playgroud)
因为为了使在文本框的中间正好对准用户名和密码的文本,我不得不把字面间距值20的VStack,我不喜欢,因为最有可能它不会在不同的设备尺寸的工作。
有人看到一种更好的方法来达到相同的结果吗?
谢谢