2012-06-12 3 views
10

У меня есть (вертикальный) UISlider внутри UIScrollview. Я хотел бы иметь возможность изменить значение ползунка и, не поднимая пальца, прокручивать прокрутку влево или вправо.Touch on UISlider предотвращает прокрутку UIScrollView

Желаемая поведение:

Нажмите вниз внутри вертикального UISlider, а затем пальцем перетащите влево или вправо приводит к тому, Scrollview прокручивать

Фактическое поведение:

приземлится внутри вертикальной UISlider , а затем перетаскивание пальца влево или вправо не вызывает движения в UIScrollview. A touch down за пределами UISlider, за которым следует перетаскивание, прокрутит прокрутку в ожидании

UIView имеет свойство, называемое exclusiveTouch, которое похоже на то, что оно может быть связано с моей проблемой. Я попробовал установить его НЕТ, без везения.

Итак, как можно настроить мои UISliders так, чтобы прокручивание под ними отвечало на касания, которые происходят внутри UISliders?

+5

+1 для желаемого/ожидаемого результата по сравнению с фактическим результатом. Больше вопросов должно это сделать. –

ответ

4

Ты пробовал подкласс UIScrollView с реализацией - (BOOL)touchesShouldCancelInContentView:(UIView *)view?Согласно документации Apple:

// called before scrolling begins if touches have already been delivered to a subview of the scroll view. if it returns NO the touches will continue to be delivered to the subview and scrolling will not occur 
// not called if canCancelContentTouches is NO. default returns YES if view isn't a UIControl 

Если вы просто вернуть NOview, если это ваш UISlider, это может делать то, что вы хотите, предполагая, что ваши UIScrollView только свитки по горизонтали. Если это не сработает, вам, вероятно, придется выполнять пользовательскую обработку касания (то есть переопределять touchesBegan:withEvent:, touchesChanged:withEvent: и т. Д.) Как для вашего UIScrollView, так и для вашего UISlider.

+0

Сделал трюк. Благодаря! – morgancodes

2

То, что вы видите, - это предполагаемое поведение.

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

Чтобы сделать то, что вы пытаетесь сделать, вам придется самому заниматься сенсорным управлением. Передача события обоим вашим представлениям. Вы можете сделать это, выполнив все методы touchesBegan:, touchesMoved: и передайте события обоим представлениям. Вы можете узнать больше об этом подходе в UIResponder documentation. Другим подходом является обработка событий в UIGestureRecognizer в представлении прокрутки, которое ударяет по ползунку и обновляет значение ползунка с помощью y-delta. Вы можете больше узнать о распознавателях жестов и обработке событий в the section about Gesture Recognizers in the Event Handling Guide for iOS.


Примечание стороны:

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

+0

+1 для «Чтобы делать то, что вы пытаетесь сделать, вам придется самому заниматься сенсорным управлением». – morgancodes

+0

@morgancodes Да, возможно, немного расплывчато. Я добавил две основные альтернативы и ссылки на соответствующую документацию о том, как сделать свою собственную сенсорную обработку. –

1

Ваш вопрос меня немного смутил. Вы говорите вертикальный слайдер, но перетаскиваете влево и вправо?

Если вы хотите, чтобы прокрутить Scrollview при перетаскивании UISlider, правильный способ сделать так

[mySlider addTarget:self action:@selector(sliderMoved:) forControlEvents:UIControlEventValueChanged]; 

и

- (void) sliderMoved:(UISlider*) slider { 
    myScrollView.contentOffset.x = slider.value * (myScrollView.contentSize.width - myScrollView.bounds.size.width); 
} 

Надежда это то, что вы хотите.

+0

Спасибо за ваш ответ, но это не то, что я прошу. Я пытаюсь понять, как разрешить прикосновенияМодущее событие применять к UIScrollview, а не только UISlider внутри scrollview. Я хочу вертикальное перетаскивание, чтобы изменить значение ползунка и горизонтальное перетаскивание, чтобы изменить положение UIScrollview, как это было бы, если бы не было вертикального слайдера. – morgancodes

0

Я думаю, что вы можете получить некоторую ссылку от this. Пример в этом примере показывает, как отменить любое касание или любые распознаватели жестов и применить их к другим представлениям.

Может ли это привести вас к решению вашей проблемы, и если это будет просто дайте мне знать об этом

Happy Codding :)

1

Вам нужно установить delaysContentTouches, как NO и предотвратить для объектов UISlider для прокрутки , Проверьте код ниже.

mySlider.delaysContentTouches = NO; 

- (BOOL)touchesShouldBegin:(NSSet *)touches withEvent:(UIEvent *)event inContentView:(UIView *)view { 
    if ([view isKindOfClass:[UISlider class]]) 
    { 
     UITouch *touchEvent = [[event allTouches] anyObject]; 
     CGPoint locationEvent = [touchEvent locationInView:view]; 
     CGRect thumbRect; 
     UISlider *mySlide = (UISlider*) view; 
     CGRect trackRect = [mySlide trackRectForBounds:mySlide.bounds]; 
     thumbRect = [mySlide thumbRectForBounds:mySlide.bounds trackRect:trackRect value:mySlide.value]; 
     if (CGRectContainsPoint(thumbRect, locationEvent)) 
      return YES; 
    } 
    return NO; 
} 
Смежные вопросы