extension View {
/// Pins a child view to the top or bottom of the parent.
func extendingVStack<Content>(
edge: VerticalEdge, /// Either .top or .bottom.
alignment: HorizontalAlignment = .center,
spacing: CGFloat? = nil,
@ViewBuilder content: @escaping () -> Content
) -> some View where Content: View {
/// Use an `overlay` to prevent affecting other views in the hierarchy.
overlay {
/// This lets you get the size of the parent view.
GeometryReader { geometry in
/**
GeometryReader's default alignment is finicky — we should override it with our own alignment
First, we use`Color.clear`, which expands to fill the geometry reader's space
Then, we can add an `overlay` with a custom alignment.
*/
Color.clear
.overlay(
alignment: edge == .top
? .bottom /// If the desired edge is `top`, the content should be pinned to the bottom.
: .top /// If the desired edge is `bottom`, the content should be pinned to the top.
) {
VStack(alignment: alignment, spacing: spacing) {
if edge == .top {
content()
}
Color.clear
.frame(height: geometry.size.height) /// Placeholder for positioning — should match the frame of the parent view.
if edge == .bottom {
content()
}
}
}
}
}
}
}
4条答案
按热度按时间6bc51xsx1#
你可以使用offset来设置circle后面的文字。下面的代码可以帮助你:
agxfikkp2#
这是一个伟大的使用覆盖组合与对准指南。
请注意,这是一个简单且可扩展的解决方案,不需要任何花哨的代码,只需要一个对齐指南。
w6lpcovy3#
SwiftUI带有两个强大的修饰符:
overlay
和background
。当您希望添加子视图而不影响其他视图的布局时,这些视图特别有用。您的问题有点不同-您试图将子视图固定到父视图的边界之外的边缘-但
overlay
仍然可以工作。下面是一个包含GeometryReader
的可能解决方案:用法:
envsm3lx4#
我不太清楚你到底想达到什么目的,但如果你只是想让文本在图像下居中,这应该可以解决你的问题。然而,如果文本是多行的,文本的
y
位置将向上移动,除非一切都是固定的,或者文本字体在单行中缩小。