SwiftUI - Получить размер ребенка? - PullRequest
1 голос
/ 13 июня 2019

Есть ли способ получить размер дочернего представления в SwiftUI?

Я в основном ищу UIKit эквивалент:

self.child.frame.origin.x -= self.child.intrinsicContentSize.width/2.0

Я не думаю, что GeometryReader будет работать, поскольку он возвращает доступный размер в родительском элементе.

[Редактировать] Я обнаружил, что можно получить и сохранить размеры, используя .alignmentGuide(_, computeValue:), хотя это определенно хак.

LessonSliderText(text: self.textForProgress(self.progress), color: self.completedColor)
    .alignmentGuide(HorizontalAlignment.leading) { (dimensions) -> Length in
        self.textSize = CGSize(width: dimensions.width, height: dimensions.height)
        return 0
    }
    .offset(x: self.width*self.currentPercentage - self.textSize.width / 2.0)
    .offset(y: -self.textSize.height/2.0)
    .animation(nil)
    .opacity(self.isDragging ? 1.0 : 0.0)
    .animation(.basic())

What I'm trying to accomplish

1 Ответ

0 голосов
/ 27 июня 2019

В основном, ответом на данный момент является использование GeometryReader внутри дочернего модификатора background(...).Это не будет оцениваться до тех пор, пока представление не будет выложено.

// This won't be valid until the first layout pass is complete
@State var childRect: CGRect = .zero

var body: some View {
    Text("Hello World!")
        .background(
            GeometryReader { proxy in
                let rect = proxy.frame(in: .global)
                // This avoids an infinite layout loop
                if rect.integral != self.childRect.integral {
                    DispatchQueue.main.async(after: .now()) {
                        self.childRect = rect
                }
            }
            // Just `EmptyView()` results in the background being ignored, so the size won't be calculated.
            return AnyView(EmptyView())
        }
    )
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...