2009-10-16 2 views
1

Все еще iphone dev стартер, но пытается.Эффект привязки к сетке с кварцем 2d? iphone dev

Я хотел бы, чтобы пользователь коснулся экрана, с которого точка (точка) будет помещена на вид.

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

CGPoint drawPoint = CGPointMake (lastTouch.x - horizontalOffset, lastTouch.y -> verticalOffset); [drawImage drawAtPoint: drawPoint]; // Сообщает изображение рисовать себе

У меня есть сетка в качестве фона на ViewController, перекрывая, что сетка у меня есть UIView с пользовательской графикой, которая отображает ПИН-код каждый раз, когда пользователь прикасается к экрану.

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

Так привязываться к эффекту сетки. Есть идеи?

ответ

5

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

// assume these constants 
// kVGridOffset, kHGridOffset: the difference between the origin of the view 
// and the origin of the grid 
// kVGridSpacing, kHGridSpacing: the size of the grid itself 

// set initial coordinates from touch 
CGPoint drawPoint = CGPointMake(lastTouch.x - horizontalOffset, lastTouch.y - verticalOffset); 

// remove the offset, round to nearest increment of spacing, and return offset 
drawPoint.x = floor((drawPoint.x - kHGridOffset)/kHGridSpacing + 0.5) * kHGridSpacing + kHGridOffset; 
drawPoint.y = floor((drawPoint.y - kVGridOffset)/kVGridSpacing + 0.5) * kVGridSpacing + kVGridOffset; 

// draw the image 
[drawImage drawAtPoint:drawPoint]; 

EDIT: при наличии nearbyint() для закругления, вещи могут быть немного аккуратнее:

drawPoint.x = nearbyint((drawPoint.x - kHGridOffset)/kHGridSpacing) * kHGridSpacing + kHGridOffset; 
drawPoint.y = nearbyint((drawPoint.y - kVGridOffset)/kVGridSpacing) * kVGridSpacing + kVGridOffset; 
+0

Это лучшее решение, чем мое;) – Jasarien

+0

Как вы вычисляете gridOffSet? Если оба представления накладываются друг на друга, размер не будет одинаковым? @ sixten-otto – JasonBourne

+0

Они могут, и смещения могут быть нулевыми. Но если происхождение сетки не находится в самом начале наложения, эти константы будут учитывать разницу. Точные значения будут зависеть от особенностей вашего приложения. –

1

Вам понадобится какая-то структура данных, представляющая сетку в вашем контроллере вида. Возможно, он будет содержать массив координат, каждый из которых представляет собой вертикальную и горизонтальную линии.

Затем, когда вы касаетесь вида, вы сравниваете значение y со всеми значениями y в структуре сетки и выбираете тот, который ближе всего. То же самое для значения x. Это должно дать идею привязки к сетке.

+0

Идея я пинал о том, чтобы округлить значение касания х и у координаты до ближайшего 5, может ли это также произвести желаемый эффект? –

+1

Это зависит от вашей логики округления. Многие люди забывают, что когда вы бросаете float в int, округления не происходит - значение усечено, поэтому 12.6 станет 12. Вы можете использовать nearint() (объявленный в math.h) для округления своих чисел. – Jasarien

+0

nearint() также сделает мое решение опрятным (показывает, сколько программ программирования я сделал в последнее время ... Я понятия не имел, что существует!) –

Смежные вопросы