赞
踩
func alignmentGuide(_ g: HorizontalAlignment, computeValue: @escaping (ViewDimensions) -> CGFloat) -> some View
func alignmentGuide(_ g: VerticalAlignment, computeValue: @escaping (ViewDimensions) -> CGFloat) -> some View
public struct ViewDimensions {
public var width: CGFloat { get } // The view's width
public var height: CGFloat { get } // The view's height
public subscript(guide: HorizontalAlignment) -> CGFloat { get }
public subscript(guide: VerticalAlignment) -> CGFloat { get }
public subscript(explicit guide: HorizontalAlignment) -> CGFloat? { get }
public subscript(explicit guide: VerticalAlignment) -> CGFloat? { get }
}
Text("Hello")
.alignmentGuide(HorizontalAlignment.leading, computeValue: { d in
return d[HorizontalAlignment.leading] + d.width / 3.0 - d[explicit: VerticalAlignment.top]
})
d[HorizontalAlignment.leading] + d.width / 3.0 - d[explicit: VerticalAlignment.top]
d[.leading] + d.width / 3.0 - d[explicit: .top]
extension HorizontalAlignment {
public static let leading: HorizontalAlignment
public static let center: HorizontalAlignment
public static let trailing: HorizontalAlignment
}
d[.trailing]
d[explicit: .trailing]
extension VerticalAlignment {
public static let top: VerticalAlignment
public static let center: VerticalAlignment
public static let bottom: VerticalAlignment
public static let firstTextBaseline: VerticalAlignment
public static let lastTextBaseline: VerticalAlignment
}
ZStack(alignment: Alignment(horizontal: .leading, vertical: .top)) { ... }
ZStack(alignment: .topLeading) { ... }
extension HorizontalAlignment {
private enum WeirdAlignment: AlignmentID {
static func defaultValue(in d: ViewDimensions) -> CGFloat {
return d.height
}
}
static let weirdAlignment = HorizontalAlignment(WeirdAlignment.self)
}
struct CustomView: View { var body: some View { VStack(alignment: .weirdAlignment, spacing: 10) { Rectangle() .fill(Color.primary) .frame(width: 1) .alignmentGuide(.weirdAlignment, computeValue: { d in d[.leading] }) ColorLabel(label: "Monday", color: .red, height: 50) ColorLabel(label: "Tuesday", color: .orange, height: 70) ColorLabel(label: "Wednesday", color: .yellow, height: 90) ColorLabel(label: "Thursday", color: .green, height: 40) ColorLabel(label: "Friday", color: .blue, height: 70) ColorLabel(label: "Saturday", color: .purple, height: 40) ColorLabel(label: "Sunday", color: .pink, height: 40) Rectangle() .fill(Color.primary) .frame(width: 1) .alignmentGuide(.weirdAlignment, computeValue: { d in d[.leading] }) } } } struct ColorLabel: View { let label: String let color: Color let height: CGFloat var body: some View { Text(label).font(.title).foregroundColor(.primary).frame(height: height).padding(.horizontal, 20) .background(RoundedRectangle(cornerRadius: 8).fill(color)) } }
extension VerticalAlignment { private enum MyAlignment : AlignmentID { static func defaultValue(in d: ViewDimensions) -> CGFloat { return d[.bottom] } } static let myAlignment = VerticalAlignment(MyAlignment.self) } struct CustomView: View { @State private var selectedIdx = 1 let days = ["Monday", "Tuesday", "Wednesday", "Thursday", "Friday", "Saturday", "Sunday"] var body: some View { HStack(alignment: .myAlignment) { Image(systemName: "arrow.right.circle.fill") .alignmentGuide(.myAlignment, computeValue: { d in d[VerticalAlignment.center] }) .foregroundColor(.green) VStack(alignment: .leading) { ForEach(days.indices, id: \.self) { idx in Group { if idx == self.selectedIdx { Text(self.days[idx]) .transition(AnyTransition.identity) .alignmentGuide(.myAlignment, computeValue: { d in d[VerticalAlignment.center] }) } else { Text(self.days[idx]) .transition(AnyTransition.identity) .onTapGesture { withAnimation { self.selectedIdx = idx } } } } } } } .padding(20) .font(.largeTitle) } }
extension VerticalAlignment { private enum MyVerticalAlignment : AlignmentID { static func defaultValue(in d: ViewDimensions) -> CGFloat { return d[.bottom] } } static let myVerticalAlignment = VerticalAlignment(MyVerticalAlignment.self) } extension HorizontalAlignment { private enum MyHorizontalAlignment : AlignmentID { static func defaultValue(in d: ViewDimensions) -> CGFloat { return d[.leading] } } static let myHorizontalAlignment = HorizontalAlignment(MyHorizontalAlignment.self) } extension Alignment { static let myAlignment = Alignment(horizontal: .myHorizontalAlignment, vertical: .myVerticalAlignment) } struct CustomView: View { var body: some View { ZStack(alignment: .myAlignment) { ... } } }
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。