Пользовательский UISlider: избегайте обновления при перетаскивании за пределы - PullRequest
3 голосов
/ 27 ноября 2011

Я довольно новичок в разработке для iPhone и создаю свое первое приложение :) В одном из моих контроллеров представления я построил нестандартный слайдер, который должен вести себя как собственный слайдер «слайд для разблокировки».

Сейчас я сомневаюсь, как реализовать поведение «перетаскивания наружу».Как я уже сказал, мне бы хотелось, чтобы он был точно таким же, как и у родного слайдера, это означает, что когда палец перетаскивает ползунок, если он выдвигается, ползунок должен стремиться к нулю.

Мои сомнения не в этомв части анимации (я уже успешно использую блок анимации), но в части управления событиями.Какое управляющее событие мне следует использовать?

Я использую:

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

для обработки скользящей части (палец перемещает курсор) и

[customSlider addTarget:self action:@selector(sliderAction:) forControlEvents:UIControlEventTouchUpInside];

дляобработать часть релиза, но проблема в том, что если я отпущу палец снаружи, функция sliderAction не будет вызвана.

РЕДАКТИРОВАТЬ: я пытался реализовать решение, которое дал мне Бруно Домингес, но японимая, что проблема в том, что по умолчанию UISlider продолжает обновляться, даже если палец перетаскивается за его пределы (попробуйте открыть, например, раздел «Яркость» в «Системных настройках», и вы увидите, что ползунок будет продолжать обновляться, даже если вы перетаскиваете за пределыэтого).Поэтому мой вопрос можно переопределить: как избежать этого поведения по умолчанию и обновлять ползунок только при движении пальца по нему?

Ответы [ 2 ]

4 голосов
/ 27 ноября 2011

Просто прервите методы touch в вашем пользовательском подклассе и перенаправьте только те касания, с которыми вы хотите воздействовать, в суперкласс, например:

в .ч:

@interface CustomSlider : UISlider
@end

дюйм. М:

#import "CustomSlider.h"
@implementation CustomSlider
-(void)touchesBegan:(NSSet *)touches withEvent:(UIEvent *)event{
    CGPoint touchLocation = [[touches anyObject] locationInView:self];
    if (touchLocation.x < 0 || touchLocation.y<0)return;
    if (touchLocation.x > self.bounds.size.width || touchLocation.y > self.bounds.size.height)return;
    [super touchesBegan:touches withEvent:event];
}
-(void)touchesMoved:(NSSet *)touches withEvent:(UIEvent *)event{
    CGPoint touchLocation = [[touches anyObject] locationInView:self];
    if (touchLocation.x < 0 || touchLocation.y<0)return;
    if (touchLocation.x > self.bounds.size.width || touchLocation.y > self.bounds.size.height)return;
    [super touchesMoved:touches withEvent:event];
}
-(void)touchesEnded:(NSSet *)touches withEvent:(UIEvent *)event{
    CGPoint touchLocation = [[touches anyObject] locationInView:self];
    if (touchLocation.x < 0 || touchLocation.y<0)return;
    if (touchLocation.x > self.bounds.size.width || touchLocation.y > self.bounds.size.height)return;
    [super touchesEnded:touches withEvent:event];
}
-(void)touchesCancelled:(NSSet *)touches withEvent:(UIEvent *)event{
    CGPoint touchLocation = [[touches anyObject] locationInView:self];
    if (touchLocation.x < 0 || touchLocation.y<0)return;
    if (touchLocation.x > self.bounds.size.width || touchLocation.y > self.bounds.size.height)return;
    [super touchesCancelled:touches withEvent:event];
}
@end

Обратите внимание, что эта реализация начнет обновлять элемент управления, если ваш палец вернется к элементу управления. Чтобы устранить это, просто установите флаг, если касание получено за пределами вида, затем проверьте этот флаг в последующих методах касаний.

0 голосов
/ 27 ноября 2011

Вам необходимо установить [slider addTarget:self action:@selector(eventDragOutside:) forControlEvents:UIControlEventTouchDragOutside];

И добавить функцию

- (IBAction)eventDragOutside:(UISlider *)sender { sender.value = 0.0f; }

...