在UISlider中增加拇指“点击区域”

我正在创build一个自定义的UISlider,想知道如何增加一个拇指图像的“点击区域”? 下面的代码工作很好,除了拇指的“点击区域”保持不变。 如果我没有错,我相信标准的拇指区域是19px? 可以说我想用下面的代码将它增加到35px,我需要采取哪些步骤? 请记住,我不是这方面的专家。

编辑 下面的代码已更正,准备好复制意大利面! 希望它可以帮助你!

main.h

#import "MyUISlider.h" @interface main : MLUIViewController <UITableViewDelegate, UITableViewDataSource, UISearchBarDelegate, UIActionSheetDelegate, UIAlertViewDelegate, MFMailComposeViewControllerDelegate, UIGestureRecognizerDelegate, MLSearchTaskDelegate, MLDeactivateDelegate, MLReceiptDelegate> { .......... } - (void)create_Custom_UISlider; 

的main.m

 - (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 

您必须在自定义子类中 重写 thumbRectForBounds:trackRect:value:而不是像在代码中那样自己调用方法,除了返回一个您甚至不需要检索的值之外什么也不做)。

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

更新了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]; 

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

总之,我实现了hittesting方法,所以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]; } 

查看课程了解更多详情

为什么你要去自定义滑块,而你可以改变默认滑块的面积;)

看看这个代码它为我工作,以增加我的UISlider触摸面积希望它也可以帮助你

 CGRect sliderFrame = yourSlider.frame; sliderFrame.size.height = 70.0; [yourSlider setFrame:sliderFrame]; 

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

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

方法。 你可以返回YES,这些点,你想被触摸。