#swift #xcode #uigesturerecognizer #cgrect
Вопрос:
Я хочу получить самые низкие и самые высокие координаты x и y из события touchesmoved, независимо от того, какая фигура нарисована. В принципе, я хочу создать cgrect, который охватывает форму. Я понятия не имею, как это сделать.
Ответ №1:
Для этого существуют различные способы.
UIBezierPath
имеет метод границ, который даст вам ограничивающий прямоугольник, содержащий все точки на пути. Если вы строите свою фигуру в а UIBezierPath
, это должно быть все, что вам нужно.
Если вам нужно самостоятельно отслеживать границы, настройте некоторые переменные и отрегулируйте их по мере необходимости:
var minY = CGFloat.greatestFiniteMagnitude
var maxY = -CGFloat.greatestFiniteMagnitude
var minX = CGFloat.greatestFiniteMagnitude
var maxX = -CGFloat.greatestFiniteMagnitude
По мере того как вы набираете баллы у своего пользователя, если x
координата < minX
указана , обновите minX
ее . Если это так > maxX
, обновите maxX
. Сделайте то же minY
самое для maxY
и.
Как только у вас будут максимальные и минимальные значения x
, и y
будет тривиально преобразовать эти значения в ограничивающий прямоугольник. Некоторые примеры кода:
extension CGRect {
init(minX: CGFloat,
minY: CGFloat,
maxX: CGFloat,
maxY: CGFloat) {
self.init()
origin = CGPoint(x: minX, y: minY)
size = CGSize(width: maxX - minX, height: maxY - minY)
}
}
let aMinX: CGFloat = CGFloat(Int.random(in: 0...50))
let aMinY: CGFloat = CGFloat(Int.random(in: 0...50))
let aMaxX: CGFloat = CGFloat(Int.random(in: 60...200))
let aMaxY: CGFloat = CGFloat(Int.random(in: 60...200))
let aRect: CGRect = CGRect(minX: aMinX,
minY: aMinY,
maxX: aMaxX,
maxY: aMaxY)
print(aRect)
Комментарии:
1. Спасибо за ответ, но что-то не так. Используя этот код в событии touchesmoved, я получаю большую разницу каждый раз, когда отслеживаю один и тот же путь. Я понимаю, что с помощью мыши я не собираюсь получать точные данные, но при 5-кратном прослеживании изображения получаются значительно разные размеры прямой кишки.(15,43,56,76) (28,9,32,55)(41,42,125,134)(5,4,10,71)(38,48,128,73) Мысли?
2. Я набрал этот код примерно за 5 минут. Это непроверено и предназначено только в качестве руководства по вашему подходу. (И я не предоставил код, который обнаруживает прикосновения, превышающие максимумы/минимумы.) Вам нужно будет протестировать и отладить его. Я бы предложил, чтобы ваша тестовая версия нарисовала полупрозрачный прямоугольник вокруг ограничивающего прямоугольника, который она создает, чтобы вы могли видеть, что она делает.
3. Похоже, я использовал неправильные константы для начальных значений. Вы должны использовать
greatestFiniteMagnitude
и-greatestFiniteMagnitude
вместо этого. Я отредактирую свой ответ.4. Хорошо, я нашел то, что мне было нужно, и спасибо за вашу помощь. В итоге я просто использовал path.bounds.size(ширина и высота).
5. Да, использование границ пути было моим первым предложением.