Отличается между UIView и UIControl при перетаскивании внутри UIScrollView - PullRequest
3 голосов
/ 19 июля 2010

У меня есть UIScrollView, который содержит небольшой подкласс UIView.UIScrollView поддерживает прокрутку, и я хочу, чтобы каждый UIView можно было свободно перетаскивать внутри UIScrollView.

Мой подкласс UIView имеет следующий метод:

- (void)touchesBegan:(NSSet *)touches withEvent:(UIEvent *)event {
    UITouch *touch = [touches anyObject];
    if ([touch view] != self) {
        return;
    }
    CGPoint touchPoint = [touch locationInView:self.superview];
    originalX = self.center.x;
    originalY = self.center.y;
    offsetX = originalX - touchPoint.x;
    offsetY = originalY - touchPoint.y;
    [self.superview bringSubviewToFront:self];
}

- (void)touchesMoved:(NSSet *)touches withEvent:(UIEvent *)event {
    UITouch *touch = [touches anyObject];
    if ([touch view] == self) {
        CGPoint location = [touch locationInView:self.superview];
        CGFloat x = location.x + offsetX;
        CGFloat y = location.y + offsetY;
        self.center = CGPointMake(x, y);        
        return;
    }
}

- (void)touchesCancelled:(NSSet *)touches withEvent:(UIEvent *)event {
    UITouch *touch = [touches anyObject];
    if ([touch view] == self) {
        self.center = CGPointMake(originalX, originalY);
    }
}

Я обнаружил, что touchesCancelled: withEvent будет вызываться при каждомпросто перетащите UIView на несколько пикселей.Но эти коды будут работать правильно, если это подкласс UIControl.Почему?

Заранее спасибо!

1 Ответ

3 голосов
/ 19 июля 2010

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

Чтобы включить собственное перетаскивание подпредставлений, вы можете создать подкласс UIScrollView и переопределить touchesShouldBegin:withEvent:inContentView: и touchesShouldCancelInContentView:.

...