switch iphone ios uislider

iphone - switch - uistepper



Aumentar un "área de clic" con los pulgares en UISlider (5)

¿Por qué quieres utilizar un control deslizante personalizado mientras puedes cambiar el área de un control deslizante predeterminado?)

Eche un vistazo a este código que me sirvió para aumentar el área táctil de mi UISlider.

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

Estoy creando un UISlider personalizado y me pregunto, ¿cómo aumenta el "área de clic" de una imagen del pulgar? El código a continuación funciona bien, excepto que el "área de clic" del pulgar permanece sin cambios. Si no estoy equivocado, creo que el área del pulgar estándar es 19 px? Digamos que me gustaría aumentarlo a 35px con el siguiente código a continuación, ¿qué pasos debo seguir? Tenga en cuenta que no soy un experto en esta área en absoluto.

EDITAR ¡ El siguiente código está corregido y listo para copiar pasta! Espero que te ayude!

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! } }

EDITAR (tratando de subclasificar con el código de abajo)

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


Puedes consultar mi project doble slider

En resumen, implementé el método de prueba de éxito, por lo que se invoca 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]; }

Compruebe la class para más detalles


También tuve este problema y lo resolví anulando

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

método. Puede devolver SÍ a esos puntos que desea que se los toque.


thumbRectForBounds:trackRect:value: anular thumbRectForBounds:trackRect:value: en una subclase personalizada (en lugar de llamar al método como lo hace en su código, que no hace nada excepto devolver un valor que ni siquiera se molesta en recuperar).

thumbRectForBounds:trackRect:value: no es un método para establecer el tumb rect, sino para obtenerlo . El control deslizante llamará internamente a este thumbRectForBounds:trackRect:value: para saber dónde dibujar la imagen del pulgar, por lo que debe anularlo, como se explica en la documentación, para devolver el CGRect que desea (para que sea 35x35px como usted deseo).


Actualizado para Swift 3.0 y 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)) } }

Vocación:

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

Respuesta original:

Con mucho, el método más sencillo es aumentar el tamaño de la imagen del pulgar con un borde invisible alrededor:

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

Y que agregar esta imagen al deslizador:

[self.sliderView setThumbImage:[self generateHandleImageWithColor:[UIColor redColor]] forState:UIControlStateNormal];