Сочетание горизонтального и вертикального ползунков в один


Я совмещаю 2 UISliders сделан с нуля -- одна горизонтальная и одна вертикальная -- сделать один ползунок, который контролирует 2 параметра. Они настроены так, что вертикальный слайдер перпендикулярна к горизонтальной. (Как крест) ручку, большой палец может двигаться как горизонтально, так и вертикально, и если он перемещается по горизонтали, вертикали трекер будет двигаться влево и вправо, чтобы следить за палец.

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

Это то, что я придумал. (Это в обычай ему UIView, который содержит оба ползунка. Кроме того, размер наследник UIView-100 х 100, и ползунки каждые 90 пунктов.)

- (BOOL)continueTrackingWithTouch:(UITouch *)touch withEvent:(UIEvent *)event {   

CGPoint touchPoint = [touch locationInView:self];

CGFloat hLimitLeft = horizontalSliderFrame.origin.x + .5* ksliderThickness;
CGFloat hLimitRight = horizontalSliderFrame.origin.x + horizontalSliderFrame.size.width - .5* ksliderThickness;
CGFloat vLimitTop = verticalSliderFrame.origin.y + .5* ksliderThickness;
CGFloat vLimitBottom = verticalSliderFrame.origin.y +  verticalSliderFrame.size.height - .5* ksliderThickness;

CGRect thumbBoundaries = CGRectMake(hLimitLeft, vLimitTop, hLimitRight - hLimitLeft, vLimitBottom - vLimitTop) ;

if (CGRectContainsPoint(thumbBoundaries, touchPoint)) {


    self.thumb.center = CGPointMake(touchPoint.x, touchPoint.y);

    [self setNeedsDisplay];
    [self updateValues];


}

return YES;

}

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

Я интересно, если есть лучший способ для разработки этого кодекса.



359
3
задан 22 ноября 2011 в 08:11 Источник Поделиться
Комментарии
1 ответ

Как только ваш элемент управления является активным, просто держать отслеживать до касания концов, даже если касания движется снаружи вид:

- (BOOL)continueTrackingWithTouch:(UITouch *)touch withEvent:(UIEvent *)event {
CGPoint touchPoint = [touch locationInView:self];

CGFloat hLimitLeft = horizontalSliderFrame.origin.x + .5* ksliderThickness;
CGFloat hLimitRight = hLimitLeft + horizontalSliderFrame.size.width - ksliderThickness;
CGFloat vLimitTop = verticalSliderFrame.origin.y + .5* ksliderThickness;
CGFloat vLimitBottom = vLimitTop + verticalSliderFrame.size.height - ksliderThickness;

self.thumb.center.x = MAX(hLimitLeft, MIN(hLimitRight, touchPoint.x));
self.thumb.center.y = MAX(vLimitTop, MIN(vLimitBottom, touchPoint.y));

[self setNeedsDisplay];
[self updateValues];

return YES;
}

Обратите внимание, что я изменил расчет hLimitLeft и vLimitTop. Я думаю, что такой подход понятнее (в частности, я пропустил разными знаками на .5 * ksliderThickness срок первые пару раз).

Это было время, поскольку я сделал iOS-разработке, так что возможны некоторые незначительные ошибки, но это должно вам начать работу в правильном направлении.

2
ответ дан 27 января 2012 в 03:01 Источник Поделиться