iPhone UIPickerView Жесты - PullRequest
       15

iPhone UIPickerView Жесты

2 голосов
/ 16 февраля 2010

Как бы мне добавить добавление событий жестов в uipickerview для изменения вкладок? Мне нужно создать собственный класс, однако я не знаю, как обращаться с uipickerview. У меня в настоящее время есть жесты, присутствующие в uiviews, чтобы сделать это, но у меня проблемы с uipickerview.

Мой код для просмотров:

#define HORIZ_SWIPE_DRAG_MIN 100
CGPoint mystartTouchPosition;
BOOL isProcessingListMove;
- (void)touchesBegan:(NSSet *)touches withEvent:(UIEvent *)event
{
    UITouch *touch = [touches anyObject];
    CGPoint newTouchPosition = [touch locationInView:self.view];
    if(mystartTouchPosition.x != newTouchPosition.x || mystartTouchPosition.y != newTouchPosition.y) {
        isProcessingListMove = NO;
    }
    mystartTouchPosition = [touch locationInView:self.view];
    [super touchesBegan:touches withEvent:event];
}

-(void)touchesMoved:(NSSet *)touches withEvent:(UIEvent *)event 
{
    UITouch *touch = touches.anyObject;
    CGPoint currentTouchPosition = [touch locationInView:self.view];

    // If the swipe tracks correctly.
    double diffx = mystartTouchPosition.x - currentTouchPosition.x + 0.1; // adding 0.1 to avoid division by zero
    double diffy = mystartTouchPosition.y - currentTouchPosition.y + 0.1; // adding 0.1 to avoid division by zero

    if(abs(diffx / diffy) > 2.5 && abs(diffx) > HORIZ_SWIPE_DRAG_MIN)
    {
        // It appears to be a swipe.
        if(isProcessingListMove) {
            // ignore move, we're currently processing the swipe
            return;
        }

        if (mystartTouchPosition.x < currentTouchPosition.x) {
            isProcessingListMove = YES;
            self.tabBarController.selectedViewController = [self.tabBarController.viewControllers objectAtIndex:0];
            return;
        }
        else {
            isProcessingListMove = YES;

            self.tabBarController.selectedViewController = [self.tabBarController.viewControllers objectAtIndex:2];

            return;
        }
    }
    else if(abs(diffy / diffx) > 1)
    {
        isProcessingListMove = YES;
        [super touchesMoved:touches withEvent:event];
    }
}

-(void)touchesEnded:(NSSet *)touches withEvent:(UIEvent *)event 
{
    isProcessingListMove = NO;
    [super touchesEnded:touches withEvent:event];
}

Спасибо за помощь.

Ответы [ 4 ]

2 голосов
/ 06 июля 2011

Вы МОЖЕТЕ подкласс UIPickerView. Проблема состоит в том, что он состоит из девяти подпредставлений, одно из которых, называемое UIPickerTable, получает события касания, например touchesBegan:withEvent:, с нужными строками. Я смог успешно перехватить их с помощью кода, приведенного в конце этого поста: Отвечая на прикосновения, начинающиеся в UIPickerView вместо UIView

Другие ответы / комментарии там тоже полезны. Я хотел очистить эфир не для того, кто делает что-то нестандартное (как в этом вопросе), а для того, кто прибыл сюда, желая создать подкласс UIPickerView, потому что первая строка принятого ответа совершенно неверна.

0 голосов
/ 16 февраля 2010

Я оставил это в покое. Это было бы странно, вы правы.

0 голосов
/ 14 марта 2011

ZT> Вы не можете создать подкласс UIPickerView. «Чтобы сделать вид сборщика более крутым, я создал подкласс UIPickerView. Мой подкласс имел ровно один метод» из Longer Spinning and Blurring . См. Также Ссылка на класс UIPickerView : «Класс UIDatePicker использует собственный подкласс UIPickerView для отображения даты и времени.»

0 голосов
/ 16 февраля 2010

Вы не можете создать подкласс UIPickerView.

Однако, поскольку представление выбора должно отображаться в другом представлении (так как оно не занимает весь экран), вы можете перехватывать касания в контроллере этого представления и фильтровать жесты.

(Предполагая, что я понимаю, что вы пытаетесь сделать ...) Я бы предупредил, что перетаскивание представления выбора для изменения вкладок является нестандартным пользовательским интерфейсом и, вероятно, запутает ваших пользователей. Так как вид сборщика воспринимается как тип управления, они будут ожидать только обычного вращательного действия сборщика. Откуда им вообще знать, что нужно выбирать вид сборщика по горизонтали?

...