23

我正在创建一个自定义 UISlider 并想知道,你如何增加拇指图像的“点击区域”?下面的代码效果很好,除了拇指的“点击区域”保持不变。如果我没记错的话,我相信标准拇指区域是 19 像素?假设我想使用下面的代码将其增加到 35px,我需要采取哪些步骤?请记住,我根本不是这方面的专家。

编辑 下面的代码已更正,可以复制意大利面了!希望对你有帮助!

主文件

#import "MyUISlider.h"

@interface main : MLUIViewController <UITableViewDelegate, UITableViewDataSource, UISearchBarDelegate, UIActionSheetDelegate, UIAlertViewDelegate, MFMailComposeViewControllerDelegate, UIGestureRecognizerDelegate, MLSearchTaskDelegate, MLDeactivateDelegate, MLReceiptDelegate>
{
  ..........

}

- (void)create_Custom_UISlider;

主文件

- (void)viewDidLoad
{

[self create_Custom_UISlider];
[self.view addSubview: customSlider];

}

- (void)create_Custom_UISlider
{
CGRect frame = CGRectMake(20.0, 320.0, 280, 0.0);


customSlider = [[MyUISlider alloc] initWithFrame:frame];

[customSlider addTarget:self action:@selector(sliderAction:) forControlEvents:UIControlEventValueChanged];
// in case the parent view draws with a custom color or gradient, use a transparent color

customSlider.backgroundColor = [UIColor clearColor];

UIImage *stetchLeftTrack = [[UIImage imageNamed:@"blue_slider08.png"]
           stretchableImageWithLeftCapWidth: 10.0 topCapHeight:0.0];
UIImage *stetchRightTrack = [[UIImage imageNamed:@"blue_slider08.png"]
            stretchableImageWithLeftCapWidth: 260.0 topCapHeight:0.0];


[customSlider setThumbImage: [UIImage imageNamed:@"slider_button00"] forState:UIControlStateNormal];
[customSlider setMinimumTrackImage:stetchLeftTrack forState:UIControlStateNormal];
[customSlider setMaximumTrackImage:stetchRightTrack forState:UIControlStateNormal];


                    customSlider.minimumValue = 0.0;
                    customSlider.maximumValue = 1.0;
                    customSlider.continuous = NO;
                    customSlider.value = 0.00;

}

-(void) sliderAction: (UISlider *) sender{

if(sender.value !=1.0){
 [sender setValue: 0.00 animated: YES];
}
else{
[sender setValue 0.00 animated: YES];
 // add some code here depending on what you want to do!
  }
}

编辑(尝试使用下面的代码进行子类化)

MyUISlider.h

#import <UIKit/UIKit.h>

@interface MyUISlider : UISlider {

}

@end

MyUISlider.m

#import "MyUISlider.h"

@implementation MyUISlider



- (CGRect)thumbRectForBounds:(CGRect)bounds trackRect:(CGRect)rect value:(float)value
{


return CGRectInset ([super thumbRectForBounds:bounds trackRect:rect value:value], 10 , 10);

}


@end
4

5 回答 5

13

您必须在自定义子类中进行覆盖 (而不是像在代码中那样自己调用该方法,除了返回一个您甚至都懒得检索的值之外什么都不做)。thumbRectForBounds:trackRect:value:

thumbRectForBounds:trackRect:value:不是设置tumb rect的方法,而是获取它。滑块将在内部调用此thumbRectForBounds:trackRect:value:方法以知道在哪里绘制拇指图像,因此您需要覆盖它(如文档中所述)以返回CGRect您想要的(因此它将是您希望的 35x35px)。

于 2013-08-11T22:56:24.907 回答
13

为 Swift 3.0 和 iOS 10 更新

private func generateHandleImage(with color: UIColor) -> UIImage {
    let rect = CGRect(x: 0, y: 0, width: self.bounds.size.height + 20, height: self.bounds.size.height + 20)

    return UIGraphicsImageRenderer(size: rect.size).image { (imageContext) in
        imageContext.cgContext.setFillColor(color.cgColor)
        imageContext.cgContext.fill(rect.insetBy(dx: 10, dy: 10))
    }
}

来电:

self.sliderView.setThumbImage(self.generateHandleImage(with: .white), for: .normal)

原答案:

到目前为止,最简单的方法就是增加带有不可见边框的拇指图像的大小:

- (UIImage *)generateHandleImageWithColor:(UIColor *)color
{
    CGRect rect = CGRectMake(0.0f, 0.0f, self.bounds.size.height + 20.f, self.bounds.size.height + 20.f);
    UIGraphicsBeginImageContextWithOptions(rect.size, NO, 0.f);
    CGContextRef context = UIGraphicsGetCurrentContext();

    CGContextSetFillColorWithColor(context, color.CGColor);
    CGContextFillRect(context, CGRectInset(rect, 10.f, 10.f));

    UIImage *image = UIGraphicsGetImageFromCurrentImageContext();
    UIGraphicsEndImageContext();

    return image;
}

而不是将此图像添加到滑块:

[self.sliderView setThumbImage:[self generateHandleImageWithColor:[UIColor redColor]] forState:UIControlStateNormal];
于 2014-08-11T06:03:18.213 回答
1

我也有这个问题并通过覆盖解决了

-(BOOL)pointInside:(CGPoint)point withEvent:(UIEvent *)event

方法。你可以为那些你想要被触摸的点返回 YES。

于 2014-12-22T05:24:10.170 回答
0

你可以查看我的双滑块项目

总之,我实现了命中测试方法,因此调用了beginTrackingWithTouch 。

- (UIView *)hitTest:(CGPoint)point withEvent:(UIEvent *)event {
    if (CGRectContainsPoint(self.leftHandler.frame, point) || CGRectContainsPoint(self.rightHandler.frame, point)) {
        return self;
    }

    return [super hitTest:point withEvent:event];
}

检查课程以获取更多详细信息

于 2013-08-22T20:56:47.297 回答
0

为什么要使用自定义滑块,而您可以更改默认滑块的区域;)

看看这段代码,它对我来说增加了我的 UISlider 的触摸区域希望它也对你有帮助

CGRect sliderFrame = yourSlider.frame;
sliderFrame.size.height = 70.0;
[yourSlider setFrame:sliderFrame];
于 2013-08-23T09:46:54.207 回答