You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

SwiftUI:TextField获焦时背景随键盘移位问题求助

SwiftUI键盘弹出时背景随List移位的问题

当TextField获取焦点弹出键盘时,即便给背景Rectangle添加了.ignoresSafeArea(.all)修饰符,背景仍会跟随List向上移位,这个问题在键盘收起时表现得尤为明显——键盘收起过程中背景保持移位状态,完全收起后才跳回原始位置。

我曾尝试给List添加.ignoresSafeArea(.keyboard)修饰符,虽然解决了背景移位的问题,但导致@FocusState功能失效。

实现代码

import SwiftUI

struct ListScroll: View {
    
    // 测试数据
    let data = [
        User(id: UUID(), name: "Yevhen", age: 35),
        User(id: UUID(), name: "Petro", age: 55),
        User(id: UUID(), name: "Djohn", age: 22),
        User(id: UUID(), name: "sad", age: 22),
        User(id: UUID(), name: "Asd", age: 22),
        User(id: UUID(), name: "Asdd", age: 22),
        User(id: UUID(), name: "Asd", age: 22),
        User(id: UUID(), name: "dasds", age: 22),
        User(id: UUID(), name: "asds", age: 22),
        User(id: UUID(), name: "das", age: 22),
        User(id: UUID(), name: "dsa", age: 22),
        User(id: UUID(), name: "das", age: 22),
        User(id: UUID(), name: "fdkn", age: 22),
        User(id: UUID(), name: "dsjn", age: 22),
        User(id: UUID(), name: "ddsasd", age: 22),
        User(id: UUID(), name: "asass", age: 22),
        User(id: UUID(), name: "ASD", age: 22),
        User(id: UUID(), name: "ASDS", age: 22),
        
        User(id: UUID(), name: "ASDS", age: 22),
        User(id: UUID(), name: "ASDS", age: 22),
        User(id: UUID(), name: "ASDS", age: 22),
        User(id: UUID(), name: "ASDS", age: 22),
        User(id: UUID(), name: "ASDS", age: 22),
        User(id: UUID(), name: "ASDS", age: 22),
    ]
    
    @State var text = "Testing text"
    
    @FocusState var focusedTask: User.ID?
    
    var body: some View {
        
        ZStack {
            Rectangle() // 随键盘移动的背景
                .fill(.linearGradient(.init(colors: [.red, .blue, .orange]), startPoint: .topLeading, endPoint: .bottomTrailing))
                .ignoresSafeArea(.all)
            
            ScrollViewReader { scrollReader in
                List(data, id: \.self.id) { user in
                    VStack {
                        TextField("", text: $text )
                            .textFieldStyle(.roundedBorder)
                            .listRowSeparator(.hidden)
                            .listRowBackground(Color.clear)
                            .focused($focusedTask, equals: user.id)
                    }
                    
                }
                .scrollDismissesKeyboard(.immediately)
                .scrollContentBackground(.hidden)
            }
        }    
    }
}

struct ListScroll_Previews: PreviewProvider {
    static var previews: some View {
        ListScroll()
    }
}

现象说明

  • 键盘弹出时:背景与List一同向上移位
  • 键盘完全收起后:背景恢复至初始位置

内容的提问来源于stack exchange,提问作者Yevgen Sukhomud

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.13 04:41:11