Нажмите «Тест», чтобы определить, какая из CGPoint была ближе всего - 16 точек CGPoint в 1 UIView - PullRequest
0 голосов
/ 17 мая 2018

Я модифицировал этот пользовательский UIView от LMinh под названием LMGaugeView, чтобы он выглядел как круговая «флаконная карусель» с 16 пузырьками.

Представьте себе 16 точек (CGPoints), равномерно распределенных по краюкруг (UIView).Я хочу быть в состоянии сделать следующий сценарий:

Vial Carousel

На рисунке показано 10 флаконов, но вы поняли идею.Как только я коснусь вида круга, я хочу иметь возможность определить, какой «флакон» я нажал, основываясь только на их значении CGPoint.

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

Для этого круг является единственным видом (что означает hitTest:withEvent:будет возвращать представление круга только при каждом соприкосновении с ним.)

Вот реализация hitTest:...:

- (UIView *)hitTest:(CGPoint)point withEvent:(UIEvent *)event {
    if (!self.isUserInteractionEnabled || self.isHidden || self.alpha <= 0.01) {
        return nil;
    }

    CGRect touchRect = CGRectInset(self.bounds, -14, -14);
    if (CGRectContainsPoint(touchRect, point)) {
       for (UIView *subview in [self.subviews reverseObjectEnumerator]) {
            CGPoint convertedPoint = [subview convertPoint:point fromView:self];
            UIView *hitTestView = [subview hitTest:convertedPoint withEvent:event];
            if (hitTestView) {
                return hitTestView;
            }
        }
        return self;
    }
    return nil;
}

Есть ли еще один метод, связанный с hitTest, который мне нужно использовать длязаставить это работать?Если вам нужно увидеть больше кода, дайте мне знать.

1 Ответ

0 голосов
/ 17 мая 2018

Теорема Пифагора полезна здесь.Вы можете получить точку, где ваш пользователь коснулся экрана, затем рассчитать расстояние до каждого флакона с помощью map () и найти наименьшее значение:

let p1 = //where your user touched the view
let vialDistances = vials.map { // your vials array
    let p2 = // vial position
    let diffX = p1.x - p2.x
    let diffY = p1.y - p2.y
    return diffX * diffX + diffY * diffY
}
let index = find(vialDistances, vialDistances.min())
let closestVial = vials[index]
...