UIPageViewController与UISlider内部控制器 - 增加滑块的命中区域

时间:2014-12-24 09:35:50

标签: ios ios7 uigesturerecognizer uislider hittest

我的PageViewController中有多个控制器,在一个控制器中我有一些滑块。现在有一个问题,用户必须完全触摸滑块圆(我不确定正确的表达式,拇指? - 移动部分),我想增加区域,其中反应滑块而不是整个PageViewController。我试过这些解决方案,但它没有帮助:

  • thumbRectForBounds:

    - (CGRect)thumbRectForBounds:(CGRect)bounds trackRect:(CGRect)rect value:(float)value
    {
        return CGRectInset ([super thumbRectForBounds:bounds trackRect:rect value:value], 15, 15);
    }
    
  • 增加hitTest区域:

    - (UIView *)hitTest:(CGPoint)point withEvent:(UIEvent *)event {
        if (CGRectContainsPoint(CGRectInset(self.frame, 200, 200), point) || CGRectContainsPoint(CGRectInset(self.frame, 200, 200), point)) {
             return self;
        }
        return [super hitTest:point withEvent:event];
    }
    

我在自定义滑块类中有这些方法,因为我想重用它。最后我发现并且尚未尝试的是在滑块上创建一些对象层,其中"采取"手势并禁用PageViewController,但我不知道该怎么做,我不确定它是否是最佳解决方案。

3 个答案:

答案 0 :(得分:2)

我不是UISlider组件的忠实粉丝,因为正如您所注意到的,增加实际滑块的命中区域并非易事。我建议您使用平移手势来复制UISlider以获得更好的用户体验:

我。使用带滑块图像的单独UIImageView创建滑块背景。 II。创建PanGesture:

UIPanGestureRecognizer *pan = [[UIPanGestureRecognizer alloc] initWithTarget:self action:@selector(handlePan:);
[imageView addGestureRecognizer:pan];

III。实现handlePan方法:

- (IBAction)handlePan:(UIPanGestureRecognizer *)recognizer {

    //pan (slide) begins
    CGPoint translation = [recognizer locationInView:self.view];
    translation.y = self.slideImage.center.y;
    self.slideImage.center = translation;

    if(recognizer.state == UIGestureRecognizerStateEnded) {
        LTDebugLog(@"\n\n PAN, with spot: %f\n\n", self.slideImage.center.x);
        //do something after user is done sliding
    }
}

这种方法的最大好处是,您可以获得更好的用户体验,因为您可以根据需要调整响应式UIImageView。

或者,您可以继承UISlider并增加其中的命中空间,但根据我的经验,这会产生混合结果。

希望这有帮助

答案 1 :(得分:1)

CustomSlider类覆盖thumbRectForBounds方法中:

只需根据需要返回rect值:

- (CGRect)thumbRectForBounds:(CGRect)bounds trackRect:(CGRect)rect value:(float)value
{
    return CGRectMake (bounds.origin.x, bounds.origin.y, yourWidthValue, yourHeightValue );
}

根据您的要求更改yourWidthValueyourHeightValue。然后在使用

创建如下对象:

CustomSlider *slider  = [[CustomSlider alloc] initWithFrame:CGRectMake(0, 0, 300, 20)];
[slider thumbRectForBounds: slider.bounds trackRect:slider.frame value:15.f]; // change values as per your requirements.

希望这有帮助。

答案 2 :(得分:1)

创建一个自定义拇指图像,该图像具有较大的空边距并在滑块上设置,如下所示:

[theSlider setThumbImage:[UIImage imageNamed:@"slider_thumb_with_margins"] forState:UIControlStateNormal];

要制作图像,请使用多个UIKit图稿提取器中的任何一个获取系统拇指图像的副本(只需在网上搜索一个)。在Photoshop中打开拇指图像,并将画布大小增加两倍您想要添加的边距。确保更改画布大小而不是图像大小,因为图像大小将拉伸图像以填充新大小。这将在拇指周围放置空白区域,这将是命中测试区域的一部分,但由于它全部是透明的,因此不会改变滑块的外观。