SwiftUI如何实现视图等比例缩放 让刻度随容器同步适配
问题原因
当前刻度的宽度、高度均为硬编码的固定数值,和外层圆形容器的尺寸没有关联,因此容器缩放时刻度不会同步变化。
最佳实践方案
核心思路是把刻度的尺寸参数和外层容器的动态尺寸绑定,通过比例计算得到实时的刻度大小,避免硬编码固定数值。这种方案渲染的刻度为矢量精准样式,不会出现使用scaleEffect整体缩放带来的线条模糊、边缘发虚问题。
具体实现代码如下:
struct TestView: View { var body: some View { GeometryReader { geometry in ZStack { Circle() .fill(Color.gray) ForEach(0..<60*4) { tick in // 将容器实际高度传递给刻度生成方法 Ticks.tick(at: tick, containerHeight: geometry.size.height) } } } // 此处修改高度可测试缩放效果,刻度会同步适配 .frame(height: 100) } } struct Ticks{ static func tick(at tick: Int, containerHeight: CGFloat) -> some View { // 基于容器高度按比例计算刻度参数,可根据需求调整比例值 let lineWidth = containerHeight * 0.02 let longTickHeight = containerHeight * 0.15 let shortTickHeight = containerHeight * 0.07 return VStack { Rectangle() .fill(Color.primary) .opacity(tick % 20 == 0 ? 1 : 0.4) .frame(width: lineWidth, height: tick % 4 == 0 ? longTickHeight : shortTickHeight) Spacer() }.rotationEffect(Angle.degrees(Double(tick)/(60) * 360)) } } struct TestView_Previews: PreviewProvider { static var previews: some View { TestView() } }
内容的提问来源于stack exchange,提问作者dwayne1929
相关产品推荐
相关产品推荐

