Увеличение области "щелчка" большого пальца в UISlider
Я создаю пользовательский UISlider и задаюсь вопросом, как вы увеличиваете "область щелчка" большого пальца? Код ниже отлично работает, за исключением того, что "область щелчка" большого пальца остается неизменной. Если я не ошибаюсь, я считаю, что стандартная область большого пальца составляет 19 пикселей? Допустим, я хотел бы увеличить его до 35px следующим кодом ниже, какие шаги мне нужно предпринять? Имейте в виду, что я не эксперт в этой области.
EDIT Код ниже исправлен и готов к копированию макарон! Надеюсь, это поможет вам!
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!
}
}
EDIT (попытка подкласса с кодом ниже)
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
Ответы
Ответ 1
Вы должны переопределить thumbRectForBounds:trackRect:value:
в пользовательском подклассе (вместо того, чтобы вызывать метод самостоятельно, как в своем коде, что ничего не делает, кроме как вернуть значение, которое вы даже не удосужились получить).
thumbRectForBounds:trackRect:value:
- это не метод установки прямоугольника, а для его получения. Ползунок будет внутренне вызывать этот метод thumbRectForBounds:trackRect:value:
, чтобы знать, где рисовать изображение большого пальца, поэтому вам необходимо переопределить его - как объяснено в документации - вернуть CGRect
, который вы хотите (так, чтобы он был 35x35px по вашему желанию).
Ответ 2
Обновлено для 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];
Ответ 3
Вы можете проверить мой двойной слайдер проект
В заключение я применил метод hit test, поэтому вызывается 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];
}
Подробнее о , чтобы узнать подробности
Ответ 4
почему вы хотите перейти на пользовательский слайдер, в то время как вы можете изменить область ползунка по умолчанию;)
Взгляните на этот код, который работал у меня, чтобы увеличить область касания моего UISlider, надеюсь, что это тоже поможет.
CGRect sliderFrame = yourSlider.frame;
sliderFrame.size.height = 70.0;
[yourSlider setFrame:sliderFrame];
Ответ 5
У меня также была эта проблема и она была решена путем переопределения
-(BOOL)pointInside:(CGPoint)point withEvent:(UIEvent *)event
метод.
Вы можете вернуть YES для тех точек, которые вы хотите коснуться.