Короткая версия: Как получить координаты нажатой Button
в SwiftUI?
Я ищу что-то вроде этого (псевдокод), где geometry.x
- этоположение нажатой кнопки в текущем виде:
GeometryReader { geometry in
return Button(action: { self.xPos = geometry.x}) {
HStack {
Text("Sausages")
}
}
}
Длинная версия: Я начинаю SwiftUI и Swift, поэтому задаюсь вопросом, как лучше всего достичь этого концептуально.
Чтобы привести конкретный пример, с которым я играю:
Представьте себе систему вкладок, в которой я хочу переместить индикатор подчеркивания в положение нажатой кнопки.
[в сторону] Есть ответв этом посте это визуально делает то, к чему я иду, но это кажется довольно сложным: Как сделать размер другого представления в SwiftUI [/ aside]
Вот моя внешняя структура, котораястроит панель вкладок и прямоугольник (текущий индикатор), который я пытаюсь изменить размер и положение:
import SwiftUI
import UIKit
struct TabBar: View {
var tabs:ITabGroup
@State private var selected = "Popular"
@State private var indicatorX: CGFloat = 0
@State private var indicatorWidth: CGFloat = 10
@State private var selectedIndex: Int = 0
var body: some View {
ScrollView(.horizontal) {
HStack(spacing: 0) {
ForEach(tabs.tabs) { tab in
EachTab(tab: tab, choice: self.$selected, tabs: self.tabs, x: self.$indicatorX, wid: self.$indicatorWidth)
}
}.frame(minWidth: 0, maxWidth: .infinity, minHeight: 40, maxHeight: 40).padding(.leading, 10)
.background(Color(UIColor(hex: "#333333")!))
Rectangle()
.frame(width: indicatorWidth, height: 3 )
.foregroundColor(Color(UIColor(hex: "#1fcf9a")!))
.animation(Animation.spring())
}.frame(height: 43, alignment: .leading)
}
}
Вот моя структура, которая создает каждый элемент вкладки и включает в себя вложенный func
, чтобы получить ширинувыбранный элемент:
struct EachTab: View {
// INCOMING!
var tab: ITab
@Binding var choice: String
var tabs: ITabGroup
@Binding var x: CGFloat
@Binding var wid: CGFloat
@State private var labelWidth: CGRect = CGRect()
private func tabWidth(labelText: String, size: CGFloat) -> CGFloat {
let label = UILabel()
label.text = labelText
label.font = label.font.withSize(size)
let labelWidth = label.intrinsicContentSize.width
return labelWidth
}
var body: some View {
Button(action: { self.choice = self.tab.title; self.x = HERE; self.wid = self.tabWidth(labelText: self.choice, size: 13)}) {
HStack {
// Determine Tab colour based on whether selected or default within black or green rab set
if self.choice == self.tab.title {
Text(self.tab.title).foregroundColor(Color(UIColor(hex: "#FFFFFF")!)).font(.system(size: 13)).padding(.trailing, 10).animation(nil)
} else {
Text(self.tab.title).foregroundColor(Color(UIColor(hex: "#dddddd")!)).font(.system(size: 13)).padding(.trailing, 10).animation(nil)
}
}
}
// TODO: remove default transition fade on button click
}
}
Создание не SwiftUI UILabel
, чтобы получить ширину Button
, кажется немного проблематичным. Есть ли лучший способ?
Есть ли простой способ получить координаты нажатого SwiftUI Button
?