【问题标题】:ios Horizontal UISlider cause UIPageViewController to slide page when not intendedios Horizo​​ntal UISlider 导致 UIPageViewController 在不希望的情况下滑动页面
【发布时间】:2014-03-22 00:34:40
【问题描述】:

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

我尝试过的解决方法

  1. 覆盖 Pan Gesture 以使最小速度相关
  2. 在滑块上放置一个不可见的矩形以捕捉平移手势
  3. 覆盖 HitTest 以使拇指点击矩形更大

【问题讨论】:

    标签: ios iphone uislider uipageviewcontroller


    【解决方案1】:

    迄今为止最好的结果是在自定义扩展 UISlider 类中覆盖 Pan Gesture。发生的情况是在 UISlider 矩形中的任何位置检测到平移手势,而不仅仅是拇指。现在坚如磐石,没有浏览量滑动。

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

    如果用户在滑块矩形内点击,也会处理点击。 潘还有

    [self sendActionsForControlEvents:UIControlEventValueChanged];
    

    因为 ValueChanged 事件仅在拇指移动时发生,并且当 Pan 处理程序接管时拇指在一段距离后停止移动。

    剪切和粘贴快乐!

    代码:

    #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
    

    【讨论】:

    • 对我来说效果很好。顺便说一句,您可以删除滑动和捏合识别器,如果您不实现任何方法,则无需设置委托。
    猜你喜欢
    • 2011-01-18
    • 1970-01-01
    • 1970-01-01
    • 2016-03-19
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-03-30
    相关资源
    最近更新 更多