2013-08-11 3 views
20

Я создаю пользовательский UISlider и удивляюсь, как вы увеличиваете «область щелчка» большого пальца? Код ниже отлично работает, за исключением того, что «область щелчка» большого пальца остается неизменной. Если я не ошибаюсь, я считаю, что стандартная область большого пальца составляет 19 пикселей? Допустим, я хотел бы увеличить его до 35px следующим кодом ниже, какие шаги мне нужно предпринять? Имейте в виду, что я не эксперт в этой области.Увеличение большого пальца «область щелчка» в UISlider

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 
+0

См. Мой рабочий пример по тому же вопросу: http://stackoverflow.com/a/26316371/258931 – Thomas

+0

Возможный дубликат [Пользовательский UISlider - Увеличить размер «горячей точки»] (http://stackoverflow.com/ вопросы/13196263/custom-uislider-увеличить-hot-spot-size) –

ответ

10

Вы должны переопределитьthumbRectForBounds:trackRect:value: в пользовательских подкласса (вместо вызова метод себя, как вы делаете в вашем коде, который ничего не делает, кроме как вернуть значение, которое вы даже не удосужились получить).

thumbRectForBounds:trackRect:value: не метод установить в tumb прямоугольник, но получить его. Ползунок будет внутренне вызывать этот метод thumbRectForBounds:trackRect:value:, чтобы знать, где рисовать изображение большого пальца, поэтому вам нужно переопределить его - как объяснено в документации - вернуть нужный CGRect (так, что он будет 35x35 пикселей по вашему желанию).

+0

Ive пробовал разные подходы, но не смог. Наверное, потому что я плох и делаю что-то не так. Ive отредактировал мой код выше, не могли бы вы показать (заполнить или исправить код) и показать, как бы вы это сделали? Если нет, то за вашу помощь. Вы, по крайней мере, указали мне в правильном направлении .... – user1293618

+2

У вас есть правильная структура кода. Все, что вам нужно, - это реализовать метод для возврата правильного 'CGRect' в соответствии с' trackRect' и 'value' (поскольку большой палец находится в другом положении в зависимости от значения ползунка, конечно), как объяснено в документе. Просто простую математику. И, конечно, напишите 'customSlider = [[MyUISlider alloc] initWithFrame: frame];' в вашем 'create_Custom_UISlider' методе, чтобы инициализировать' MyUISlider', а не стандартный 'UISlider'. – AliSoftware

+0

Thanx для вас ответ Али. Я забыл изменить код на MyUISlider alloc .. Но я не понимаю, как я должен структурировать код в методе: - (CGRect) thumbRectForBounds: (CGRect) bounds trackRect: (CGRect) rect value: (float) значение { ?????? }, чтобы вернуть что-то полезное, что работает. Я понимаю, что вы не можете дать мне точные цифры, но что бы вы поместили в этот метод, если вы посмотрите на остальную часть моего кода? Thanx еще раз за вашу помощь! – user1293618

0

Вы можете проверить мой двойной слайдер project

В заключении, я реализовал метод теста хита так 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]; 
} 

Проверить class для получения более подробной информации

0

почему вы хотите пойти для пользовательского слайдера, пока вы можете изменить область слайдера по умолчанию;)

посмотрите на этот код он работал для меня увеличить площадь соприкосновения с моей UISlider надеюсь, что это поможет вам слишком

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

Это не работает. –

+0

Вы можете сделать слайдер 1000 высоким, но большим. все равно будет того же размера. – Leon

9

обновление для 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]; 
+0

Удивительный ответ! что он не имеет больше очков? –

+0

Я добавил версию Objective-C Swift 3.0, iOS 10. Работает как шарм! – matto1990

+0

этот ответ (в Swift) только сгенерировал и поместил изображение для меня. Он не менял «область щелчка» для большого пальца для меня ... – PlateReverb

0

Я также имел эту проблему и решить ее с помощью переопределения

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

метода. Вы можете вернуть ДА для тех пунктов, которые вы хотите коснуться.

Смежные вопросы