Настройка UISlider для обработки прикосновения, которое началось снаружи - PullRequest
3 голосов
/ 27 января 2012

Я хотел бы начать касание за пределами UISlider (в его суперпредставлении), а когда касание переместится на UISlider, сдвиньте его как обычно. Как мне это реализовать?

1 Ответ

3 голосов
/ 30 января 2012

Создайте свой супервизор в этом пользовательском классе и подключите розетку slider к ползунку.Он должен делать то, что вам нужно, за исключением любого пользовательского отслеживания, которое вы можете иметь на самом слайдере.Это, вероятно, не очень хорошо работает с любыми распознавателями жестов в суперпредставлении (например, если суперпредставление является представлением с прокруткой, все ставки отключены).

Это также слепо игнорирует другие представления в суперпредставлении, которые могутотвечать на прикосновения.Если вы используете более детальный контроль, обновите hitTest:forEvent: и верните MyView или ползунок только в случае необходимости.

@interface MyView : UIView
{
    BOOL _tracking;
}
@property (nonatomic, strong) IBOutlet UISlider *slider;
@end

@implementation MyView
@synthesize slider;

-(UIView *)hitTest:(CGPoint)point withEvent:(UIEvent *)event {
    UIView *superAnswer = [super hitTest:point withEvent:event];
    if( [superAnswer isEqual:self.slider] ) {
        return( superAnswer );
    }
    else {
        return( self );
    }
}

-(void) touchesMoved:(NSSet *)touches withEvent:(UIEvent *)event {
    UITouch *aTouch = [touches anyObject];
    if( [self.slider pointInside:[aTouch locationInView:self.slider] withEvent:event] ) {
        if( _tracking ) {
            [self.slider continueTrackingWithTouch:aTouch withEvent:event];
        }
        else {
            [self.slider beginTrackingWithTouch:aTouch withEvent:event];
            _tracking = YES;
        }
    }
    else {
        if( _tracking ) {
            [self.slider endTrackingWithTouch:aTouch withEvent:event];
            _tracking = NO;
        }
    }
}
@end
...