SwiftUI一篇文章学会Anchor

Anchors

在布局层次结构的不同部分之间传递点和矩形时,锚点非常有用。锚点是围绕值(例如,点)的包装,可以在视图层次结构中其他位置的不同视图的坐标系统内解析该值。我们可以将锚视为UIKit中UIView的convert(_:from :)方法的更安全替代方法.

例如,让我们考虑一个简单的标签栏组件,在其中我们可能希望显示许多标签(以文本表示)。所选选项卡应带有下划线。当用户点击一个新选项卡时,我们要为下划线的位置和宽度设置动画。这意味着下划线将不会成为标签项的一部分,而是会在视图层次结构中的其他位置绘制。我们可以使用锚点(通过首选项)传达所选选项卡的位置,并在视图层次结构的不同部分解析锚点.

我们将使用ForEach在HStack中呈现选项卡。所选项目将使用首选项传播其边界(作为Anchor<CGRect>)。在视图层次结构的更上方,我们可以读出所选项目的锚点并在该位置画一条线。第一步,我们需要一个自定义的首选项键。 BoundsKey与上面的WidthKey相似,它返回第一个非null值:

struct BoundsKey: PreferenceKey {
    static var defaultValue: Anchor<CGRect>? = nil
    static func reduce(
        value: inout Anchor<CGRect>?,
        nextValue: () -> Anchor<CGRect>?) {
        
        value = value ?? nextValue()
        
    }
}

这是在HStack中绘制项目并提供锚点的代码。我们向按钮添加anchorPreference,并使用.bounds作为值。 anchorPreference修饰符还采用了一个转换函数,该函数使我们可以将锚点转换为不同的东西。在我们的例子中,我们将其转换为可选的锚点(除非选择了当前项,否则它将为nil)

要实现在SwiftUI画廊中心放大的效果,并且自动对应位置,你可以使用SwiftUI的GeometryReader来获取视图的位置和大小,并根据位置和大小来缩放视图。同时,你可以使用SwiftUI的ScrollViewReader来获取ScrollView的位置和大小,并根据位置和大小来确定要滚动到哪个位置。下面是一个示例代码: ``` struct GalleryView: View { let images = ["image1", "image2", "image3", "image4", "image5", "image6"] @State private var selectedImage: String? @State private var selectedImageIndex: Int? var body: some View { ScrollViewReader { scrollView in ScrollView { LazyHGrid(rows: [GridItem(.flexible())]) { ForEach(images.indices, id: \.self) { index in GeometryReader { geometry in Image(images[index]) .resizable() .scaledToFit() .cornerRadius(10) .scaleEffect(selectedImageIndex == index ? 1.2 : 1) .onTapGesture { withAnimation { selectedImage = images[index] selectedImageIndex = index scrollView.scrollTo(index, anchor: .center) } } .position(x: geometry.frame(in: .global).midX, y: geometry.frame(in: .global).midY) } .frame(width: 200, height: 200) } } } .onAppear { scrollView.scrollTo(0, anchor: .center) } } } } ``` 在这个代码中,我们使用了GeometryReader来获取每个图片的位置和大小,然后使用scaleEffect来缩放图片。当用户点击图片时,我们使用withAnimation来设置selectedImage和selectedImageIndex的值,从而触发缩放效果和滚动效果。我们还使用了position来将每个图片放置在正确的位置。最后,我们使用ScrollViewReader来获取ScrollView的位置和大小,以便在初始时将第一个图片滚动到中心位置。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

知识大胖

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值