我试图将图像从右向左移动以制作动画,但无法弄清楚如何根据设备类型(iPad 和 iPhone)更改起始位置和结束位置。我无法在视图内设置 xpos 和 ypos 作为起始位置,否则我会收到“Type () 无法符合 View”错误,因此我将代码移动到 .onAppear,它根据设备类型设置 xpos 和 ypos,但此代码在起始位置已设置后执行。代码如下
import Foundation
import SwiftUI
struct Home1View: View {
@State var xpos: CGFloat = 350
@State var ypos: CGFloat = 450
@State var opac: Double = 1.0
@State var dHeight: Int = 0
let layoutProperties:LayoutProperties
var body: some View {
GeometryReader { geometry in
ZStack {
ResponsiveView {properties in
VStack{
Text("XXXX")
Image("number-one")
.resizable()
.frame(width: layoutProperties.dimensValues.frameSz, height: layoutProperties.dimensValues.frameSz)
.position(x: xpos, y: ypos)
.opacity(opac)
.onAppear {
//ipad 13in width = 1032 height 870
print("display height on appear = ", geometry.size.height)
print("display width on appear = ", geometry.size.width)
xpos = geometry.size.width - 100
ypos = geometry.size.height - 150
withAnimation(Animation.easeInOut(duration: 3).repeatCount(2, autoreverses: false)) {
xpos = 100
//.position(x: layoutProperties.dimensValues.xpos, y: layoutProperties.dimensValues.ypos-250)
} completion: {
opac = 0.0
}
}
} //end ZStack
} //end geometry
}
}
我建议使用相对定位技术来执行动画,而不是尝试设置绝对初始值
.position
然后修改该绝对位置:对图像应用填充来定义边缘的最小间隙
设置
.frame
最大尺寸并使用alignment
参数定义要对齐的角或边通过改变对齐方式来执行动画
GeometryReader
不需要a 。下面的更新版本从图像底部 100 点和后缘 50 点开始。动画将其移动到顶部 100 点和前缘 50 点(换句话说,移动到对角,与安全区域边缘的间隙相同)。这适用于所有屏幕尺寸。