Установка точки привязки для слоя UIView - PullRequest
6 голосов
/ 28 января 2011

У меня есть подкласс UIView, который я хочу иметь возможность перемещать внутри своего суперпредставления. Когда пользователь касается UIView где-то за пределами self.center, но внутри self.bounds, он «прыгает», потому что я добавляю новое местоположение к self.center, чтобы достичь фактического движения. Чтобы избежать такого поведения, я пытаюсь установить опорную точку, которая позволяет пользователю захватывать и перетаскивать вид в любое место в пределах его границ.

Моя проблема в том, что когда я вычисляю новую опорную точку (как показано в коде ниже), ничего не происходит, вид вообще не меняет положение. С другой стороны, если я установлю опорную точку в предварительно рассчитанную точку, я смогу переместить вид (но тогда, конечно, он «перескочит» в предварительно рассчитанную точку). Почему это не работает, как ожидалось?

Спасибо.

- (void)touchesMoved:(NSSet *)touches withEvent:(UIEvent *)event 
{
    // Only support single touches, anyObject retrieves only one touch
    UITouch *touch = [touches anyObject];
    CGPoint locationInView = [touch locationInView:self];

    // New location is somewhere within the superview
    CGPoint locationInSuperview = [touch locationInView:self.superview];

    // Set an anchorpoint that acts as starting point for the move
    // Doesn't work!
    self.layer.anchorPoint = CGPointMake(locationInView.x / self.bounds.size.width, locationInView.y / self.bounds.size.height);
    // Does work!
    self.layer.anchorPoint = CGPointMake(0.01, 0.0181818);

    // Move to new location
    self.center = locationInSuperview;
}

Ответы [ 2 ]

13 голосов
/ 28 января 2011

Как указал Крис Ван Баел, вам нужно будет выполнить вычисления опорных точек в методе touchsBegan:withEvent:, чтобы не свести на нет движение. Кроме того, поскольку изменение anchorPoint слоя приведет к смещению начальной позиции вида, необходимо добавить смещение к точке center вида, чтобы избежать «скачка» после первого касания.

Вы можете сделать это, рассчитав (и добавив к точке center своего вида) смещение на основе разницы между начальной и конечной точками привязки (умноженной на ширину / высоту вашего вида), или вы можете установить center вида к начальной точке касания.

Что-то вроде этого возможно:

- (void)touchesBegan:(NSSet *)touches withEvent:(UIEvent *)event {

    UITouch *touch = [touches anyObject];
    CGPoint locationInView = [touch locationInView:self];
    CGPoint locationInSuperview = [touch locationInView:self.superview];

    self.layer.anchorPoint = CGPointMake(locationInView.x / self.frame.size.width, locationInView.y / self.frame.size.height);
    self.center = locationInSuperview;
}

- (void)touchesMoved:(NSSet *)touches withEvent:(UIEvent *)event {

    UITouch *touch = [touches anyObject];
    CGPoint locationInSuperview = [touch locationInView:self.superview];

    self.center = locationInSuperview;
}

Дополнительная информация о anchorPoint из документов Apple здесь и аналогичный вопрос SO, на который я ссылался здесь .

0 голосов
/ 28 января 2011

Вы должны обновить anchorpoint только на TouchBegin.Если вы все время пересчитываете (TouchMoved), логично, что подпредставление не перемещается.

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