Как реализовать функцию привязки к сетке для UIImageView? - PullRequest
2 голосов
/ 24 марта 2011

У меня есть перетаскиваемое представление, которое я настроил со следующим кодом:

#import <UIKit/UIKit.h>

@interface DraggableView : UIImageView {

    CGPoint startLocation;
}

@end

#import "DraggableView.h"

@implementation DraggableView

- (id) initWithImage: (UIImage *) anImage
{
    if (self = [super initWithImage:anImage])
        self.userInteractionEnabled = YES;
    return self;
}

- (void) touchesBegan:(NSSet*)touches withEvent:(UIEvent*)event
{
    // Calculate and store offset, and pop view into front if needed
    CGPoint pt = [[touches anyObject] locationInView:self];
    startLocation = pt;
    [[self superview] bringSubviewToFront:self];
}

- (void) touchesMoved:(NSSet*)touches withEvent:(UIEvent*)event
{
    // Calculate offset
    CGPoint pt = [[touches anyObject] locationInView:self];
    float dx = pt.x - startLocation.x;
    float dy = pt.y - startLocation.y;
    CGPoint newcenter = CGPointMake(self.center.x + dx, self.center.y + dy);

    // Set new location
    self.center = newcenter;
}

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

Заранее благодарю за помощь в решении этой проблемы.

Ответы [ 2 ]

12 голосов
/ 24 марта 2011

В touchesMoved, прежде чем применить newcenter к вашему виду, округлите его до размера шага сетки:

float step = 10.0; // Grid step size.
newcenter.x = step * floor((newcenter.x / step) + 0.5);
newcenter.y = step * floor((newcenter.y / step) + 0.5);

Это заставит ваш вид "защелкиваться" при его перетаскивании.

4 голосов
/ 28 января 2013

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

здесь в псевдокоде (javaish)

int gridCubeWidth  = 3; //for instance
int gridCubeHeight = 3;

int newX = Math.Round(oldX / gridCubeWidth)  * gridCubeWidth;
int newY = Math.Round(oldY / gridCubeHeight) * gridCubeHeight;

, используя этот пример, точка на x, такая как x = 4, должна отображаться на 3, а x = 5 должна отображаться на 6.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...