С SwiftUI, есть ли способ ограничить размер представления другим представлением, не являющимся братом? - PullRequest
1 голос
/ 17 марта 2020

Я возлюсь с макетом представления - графиком, - где я вижу, как далеко я могу добраться в макете полностью SwiftUI. Каждый из компонентов в порядке, но сборка целого не работает так, как мне бы хотелось. Я обнаружил, что могу легко ограничить размер по одной оси стека, но не по двум осям одновременно (вертикальной и горизонтальной).

Я начал тянуться к AlignmentGuides, как обнаружил Вы можете выровнять не братьев и сестер с помощью специального руководства . Это поможет моей цели, но не решает часть определения размера, которая является сердцем этого вопроса:

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

Упрощение структуры:

HStack {
   CellOneView {
   }
   CellTwoView {
   }
}
HStack {
   CellThreeView {
   }
   CellFourView {
   }
}

Что отображается на:

+-----+-----+
|  1  |  2  |
+-----+-----+
|  3  |  4  |
+-----+-----+

Есть ли способ сообщить CellFour (который не совпадает с H Отметьте ячейки 1 и 2) чтобы я ограничил себя (и выровнял) шириной ячейки CellTwo?

Это не обязательно должно быть строго вид сетки ( пример вида сетки *) 1018 *). В данном случае меня интересуют только три вида - области, которые приблизительно отображаются в ячейку 1, ячейку 2 и ячейку 4. Я хочу, чтобы высоты ячейки 1 и ячейки 2 были одинаковыми (легко достигается с помощью текущего HStack), а ширина ячеек 2 и ячеек 4 одинакова - вот где я борюсь.

1 Ответ

2 голосов
/ 17 марта 2020

Поскольку вы уже начали использовать направляющие, это возможно с этим инструментом. Вот возможный подход (для вашего неуклюжего примера):

@State private var width: CGFloat = 10 // < initial value does not much matter
...

HStack {
   CellOneView {
   }
   CellTwoView {
   }
    .alignmentGuide(VerticalAlignment.center, computeValue: { d in
        // for simplicity of demo skipped checking for equality
        DispatchQueue.main.async { // << must be async
            self.width = d.width   // << set limit
        }
        return d[VerticalAlignment.center]
    })

}
HStack {
   CellThreeView {
   }
   CellFourView {
   }
   .frame(width: self.width) // << apply limit, updated right in next loop
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...