ios水平滑动器会导致UIPageViewController在不需要的时候滑动页面



单个或多个水平滑动条会导致页面浏览出现问题。用户很难滑动滑块的拇指而不导致页面视图滑动。

变通方法

  1. 重写平移手势使最小速度相关
  2. 在滑块上放置一个不可见的矩形来捕捉平移手势
  3. 重写HitTest使拇指点击矩形变大

目前为止最好的结果是在自定义扩展的UISlider类中重写平移手势。平移手势会在滑块矩形的任何地方被检测到,而不仅仅是大拇指。坚如磐石,现在没有页面浏览滑动。

注意:initWithFrame和initWithCoder都提供了,所以sictSlider2可以通过代码或XIB实例化。

在用户点击滑块矩形内的情况下也会处理点击。潘也有

[self sendActionsForControlEvents:UIControlEventValueChanged];

因为ValueChanged事件只在拇指移动时发生,当Pan handler接管时,拇指在一段距离后停止移动。

CutAndPaste快乐!

代码:

#import "sictSlider2.h"
@implementation sictSlider2
- (id)initWithFrame:(CGRect)frame
{
    self = [super initWithFrame:frame];
    if (self) {

        UIPanGestureRecognizer * recognizer = [[UIPanGestureRecognizer alloc] initWithTarget:self action:@selector(handlePan:)];
        recognizer.delegate = self;
        [self addGestureRecognizer:recognizer];
        UITapGestureRecognizer * recognizer2 = [[UITapGestureRecognizer alloc] initWithTarget:self action:@selector(handleTap:)];
        recognizer2.delegate = self;
        [self addGestureRecognizer:recognizer2];
        UIPinchGestureRecognizer * recognizer3 = [[UIPinchGestureRecognizer alloc] initWithTarget:self action:@selector(handlePinch:)];
        recognizer3.delegate = self;
        [self addGestureRecognizer:recognizer3];
        UISwipeGestureRecognizer * recognizer4 = [[UISwipeGestureRecognizer alloc] initWithTarget:self action:@selector(handleSwipe:)];
        recognizer4.delegate = self;
        [self addGestureRecognizer:recognizer4];
        self.backgroundColor = [UIColor clearColor];   
    }
    return self;
}

- (id)initWithCoder:(NSCoder *)aDecoder
{
    self = [super initWithCoder:aDecoder];
    if (self) {
        UIPanGestureRecognizer * recognizer = [[UIPanGestureRecognizer alloc] initWithTarget:self action:@selector(handlePan:)];
        recognizer.delegate = self;
        [self addGestureRecognizer:recognizer];
        UITapGestureRecognizer * recognizer2 = [[UITapGestureRecognizer alloc] initWithTarget:self action:@selector(handleTap:)];
        recognizer2.delegate = self;
        [self addGestureRecognizer:recognizer2];
        UIPinchGestureRecognizer * recognizer3 = [[UIPinchGestureRecognizer alloc] initWithTarget:self action:@selector(handlePinch:)];
        recognizer3.delegate = self;
        [self addGestureRecognizer:recognizer3];
        UISwipeGestureRecognizer * recognizer4 = [[UISwipeGestureRecognizer alloc] initWithTarget:self action:@selector(handleSwipe:)];
        recognizer4.delegate = self;
        [self addGestureRecognizer:recognizer4];
        self.backgroundColor = [UIColor clearColor];     
    }
    return self;
}

- (void)handleTap:(UITapGestureRecognizer *)recognizer{
    CGPoint p = [recognizer locationInView:recognizer.view];    
    NSLog (@"in slider tap %f %f ", p.x, p.y);
    float val = self.value;  // current slider value
    // t.x is in coords of the slider rect, so divide by width to get delta
    val = p.x/self.frame.size.width;
    [self setValue:val];
    [self setNeedsDisplay];
}
- (void)handlePan:(UIPanGestureRecognizer *)recognizer {
    CGPoint t = [recognizer translationInView:recognizer.view];
    NSLog(@"in slider pan %f %f", t.x, t.y);
    float val = self.value;  // current slider value
    // t.x is in coords of the slider rect, so divide by width to get delta
    val = val + t.x/self.frame.size.width;
    [self sendActionsForControlEvents:UIControlEventValueChanged];
    [self setValue:val];
    [self setNeedsDisplay];
    [recognizer setTranslation:CGPointMake(0, 0) inView:recognizer.view];   
}
- (void)handleSwipe:(UISwipeGestureRecognizer *)recognizer{
      NSLog(@"slider SWIPE");}
@end

. h

#import <UIKit/UIKit.h>
@interface sictSlider2 : UISlider
- (void)handleTap:(UITapGestureRecognizer *)recognizer;
- (void)handlePan:(UIPanGestureRecognizer *)recognizer;
- (void)handlePinch:(UIPinchGestureRecognizer *)recognizer;
- (void)handleSwipe:(UISwipeGestureRecognizer *)recognizer;
@end

相关内容

最新更新