SwiftUI中利用UIScreen判断屏幕半区实现文本拖拽定位
解决方案
要实现拖拽至屏幕上半区松手后停在顶部、下半区回到底部的逻辑,只需在DragGesture的onEnded回调中加入基于屏幕中点的位置判断即可:
修改后的完整代码
struct SwiftUIView: View { @State var offset: CGSize = .zero @State var isOnTop = false var body: some View { Text("Hello!") .frame(maxWidth: .infinity, maxHeight: .infinity, alignment: isOnTop ? .top : .bottom) .offset(offset) .gesture( DragGesture() .onChanged { value in withAnimation(.spring()) { offset = value.translation } } .onEnded { value in withAnimation(.spring()) { offset = .zero // 获取屏幕垂直方向中点 let screenMidY = UIScreen.main.bounds.midY // 判断拖拽结束位置是否在上半区 isOnTop = value.globalLocation.y < screenMidY } } ) } }
关键逻辑说明
- 屏幕中点计算:通过
UIScreen.main.bounds.midY获取设备屏幕垂直方向的中点坐标,以此作为上下半区的分界。 - 拖拽位置判断:利用
DragGesture提供的globalLocation.y(拖拽结束时的全局屏幕Y坐标)与屏幕中点比较:- 若
globalLocation.y < screenMidY,说明拖拽结束位置处于屏幕上半区,将isOnTop设为true,文本会对齐到顶部; - 若处于下半区,
isOnTop保持false,文本回到底部。
- 若
内容的提问来源于stack exchange,提问作者JackSparrow135
相关产品推荐
相关产品推荐

