#swift #macos #swiftui
Вопрос:
Я работал над проектом,и мне нужно получить положение x, y каждого угла изображения в представлении. Возможно ли этого достичь? Я создаю для macOS,и я знаю,что могу получить положение x, y изображения с помощью GeometryReader, но как я могу получить положение x, y каждого угла?
Я попытался получить x,y с помощью следующего хака, предположив, что начальная позиция равна 0,0:
.onTapGesture { print("Top left corner: (CGPoint(x: 0, y: 0))") print("Top right corner: (CGPoint(x: self.myImage.width, y: 0))") print("Bottom left corner: (CGPoint(x: 0, y: self.myImage.height))") print("Bottom right corner: (CGPoint(x: self.myImage.width, y: self.myImage.height))") }
Комментарии:
1. Правильно ли говорить, что тот, что вверху слева, имеет для вас значение: (0.0,0.0)? или вам нужна глобальная ценность? вам не совсем ясно, о чем идет речь! Я также вижу некоторые дополнения в поле зрения, как насчет этого?
2. @swiftPunk Я использую изображения внутри HStack и VStack, поэтому мне нужны глобальные значения.
3. Глобальное значение представления или монитора(экрана)?
4. @swiftPunk Просмотр изображения.
5. Возможно, вы можете показать свой проверенный код?
Ответ №1:
Вот способ для вас с помощью GeometryReader:
struct ContentView: View { var body: some View { GeometryReader { proxy in Image("ferrari") .resizable() .scaledToFit() .onTapGesture { print("Top left corner: (CGPoint(x: 0, y: 0))") print("Top right corner: (CGPoint(x: proxy.size.width, y: 0))") print("Bottom left corner: (CGPoint(x: 0, y: proxy.size.height))") print("Bottom right corner: (CGPoint(x: proxy.size.width, y: proxy.size.height))") } } .padding() } }
Комментарии:
1. Что делать, если вы поместите изображение в HStack и VStack, измените его размер и расположите по центру. Как вы можете получить координаты в этом случае, зная, что верхний левый угол не будет равен 0,0?
2. Есть другой способ считывания размера с фона! но в обоих случаях вы добьетесь успеха! Проблема не в том, что или где вы помещаете в изображение, внутри HStack или VStack! все это один и тот же процесс! Я думаю, что вы можете сначала попробовать изучить GeometryReader.
Ответ №2:
Вы можете использовать метод func frame(in: CoordinateSpace) -gt; CGRect
на прокси-сервере геометрии, но вы должны знать, в каком CoordinateSpace
прямоугольнике вы хотите получить прямоугольник. Вы хотите, чтобы размер изображения отображался в его собственном координатном пространстве? Координатное пространство его супервизора? Координатное пространство окна, в котором оно находится? Координатное пространство экрана, содержащего окно…
Как только у вас будет CGRect
представление вида в некотором координатном пространстве, вы можете использовать такие методы, как minX
, minY
, maxX
, maxY
на прямой, чтобы построить четыре угла.