UISegmentedControl con image y título

Estoy usando un UISegmentedControl dentro de un UIToolBar como button. No puedo usar un UIButtonBarItem normal, porque necesito configurar tintColor y admitir iOS 4.3. Entonces estoy usando el siguiente código:

 UISegmentedControl* searchButton = [[UISegmentedControl alloc] initWithItems:[NSArray arrayWithObjects:@"", nil]]; [searchButton setImage:[UIImage imageNamed:@"search_picto"] forSegmentAtIndex:0]; searchButton.momentary = YES; searchButton.segmentedControlStyle = UISegmentedControlStyleBar; searchButton.tintColor = [UIColor colorWithRed:0.27 green:0.60 blue:0.20 alpha:1.00]; [searchButton addTarget:self action:@selector(actionSearch:) forControlEvents:UIControlEventValueChanged]; 

Esto funciona muy bien, pero ¿hay alguna manera de que pueda tener un text / título al lado de mi image? El método setTitle: elimina la image. Tiene que haber otra forma …

Gracias por tu ayuda.

Editar: Decidí agregar el text directamente en el UIImageView así:

 NSString* label = @"My Label"; UIImage* image = [self addText:label toImage:[UIImage imageNamed:@"icon"]]; [_segmentedControl insertSegmentWithImage:image atIndex:0 animated:NO]; [_segmentedControl setWidth:image.size.width + 10]; // add some margin on the right - (UIImage *)addText:(NSString *)text toImage:(UIImage *)image { UIFont* font = [UIFont boldSystemFontOfSize: 12]; CGSize expectedSize = [text sizeWithFont:font]; [self retinaAwareUIGraphicsBeginImageContext:CGSizeMake(image.size.width + expectedSize.width + 10, image.size.height)]; [image drawAtPoint: CGPointZero]; [[UIColor whiteColor] set]; [text drawAtPoint: CGPointMake(30, 2) withFont:font]; image = UIGraphicsGetImageFromCurrentImageContext(); UIGraphicsEndImageContext(); return image; } - (void)retinaAwareUIGraphicsBeginImageContext:(CGSize) size { CGFloat scale = -1.0; if (scale<0.0) { UIScreen *screen = [UIScreen mainScreen]; if ([[[UIDevice currentDevice] systemVersion] floatValue] >= 4.0) { scale = [screen scale]; } else { scale = 0.0; } } if (scale>0.0) { UIGraphicsBeginImageContextWithOptions(size, NO, scale); } else { UIGraphicsBeginImageContext(size); } } 

testing esto :

 UISegmentedControl* searchButton = [[UISegmentedControl alloc] initWithItems:[NSArray arrayWithObjects:@"", nil]]; [searchButton insertSegmentWithImage:[UIImage imageNamed:@"up_button.png"] atIndex:0 animated:YES]; [searchButton insertSegmentWithImage:[UIImage imageNamed:@"down_button.png"] atIndex:1 animated:YES]; searchButton.segmentedControlStyle = UISegmentedControlStyleBar; searchButton.tintColor = [UIColor colorWithRed:0.27 green:0.60 blue:0.20 alpha:1.00]; [searchButton setMomentary:YES]; 

Puedes hacerlo:

agregar categoría para UIImage:

en UIImage + UISegmentIconAndText.h

 @interface UIImage (UISegmentIconAndText) + (id) imageFromImage:(UIImage*)image string:(NSString*)string color:(UIColor*)color; + (id) imageFromImage:(UIImage*)image string:(NSString*)string color:(UIColor*)color position:(NSString*)position; @end 

en UIImage + UISegmentIconAndText.m

 #import "UIImage+UISegmentIconAndText.h" @implementation UIImage (UISegmentIconAndText) + (id) imageFromImage:(UIImage*)image string:(NSString*)string color:(UIColor*)color { UIFont *font = [UIFont systemFontOfSize:16.0]; CGSize expectedTextSize = [string sizeWithAttributes:@{NSFontAttributeName: font}]; int width = expectedTextSize.width + image.size.width + 5; int height = MAX(expectedTextSize.height, image.size.width); CGSize size = CGSizeMake((float)width, (float)height); UIGraphicsBeginImageContextWithOptions(size, NO, 0); CGContextRef context = UIGraphicsGetCurrentContext(); CGContextSetFillColorWithColor(context, color.CGColor); int fontTopPosition = (height - expectedTextSize.height) / 2; CGPoint textPoint = CGPointMake(image.size.width + 5, fontTopPosition); [string drawAtPoint:textPoint withAttributes:@{NSFontAttributeName: font}]; // Images upside down so flip them CGAffineTransform flipVertical = CGAffineTransformMake(1, 0, 0, -1, 0, size.height); CGContextConcatCTM(context, flipVertical); CGContextDrawImage(context, (CGRect){ {0, (height - image.size.height) / 2}, {image.size.width, image.size.height} }, [image CGImage]); UIImage *newImage = UIGraphicsGetImageFromCurrentImageContext(); UIGraphicsEndImageContext(); return newImage; } @end 

en su código Implementar Segmento:

 UIImage *imageWithText = [UIImage imageFromImage:[UIImage imageNamed:@"images/jobaids_tab_icon"] string:@"Hello", nil) color:[UIColor whiteColor]]; [_segmentedController setImage:imageWithText forSegmentAtIndex:0]; 

Para swift

segFont es la fuente para el text embedded.

imageAlignment es la alignment de la image que aparece a la izquierda o derecha del text.

configure imageAlignment en 0 para alignment a la izquierda (la image aparecerá a la izquierda del text) y 1 para alignment a la derecha (la image aparecerá a la derecha del text)

 class func textEmbededImage(image: UIImage, string: String, color:UIColor, imageAlignment: Int = 0, segFont: UIFont? = nil) -> UIImage { let font = segFont ?? UIFont.systemFontOfSize(16.0) let expectedTextSize: CGSize = (string as NSString).sizeWithAttributes([NSFontAttributeName: font]) let width: CGFloat = expectedTextSize.width + image.size.width + 5.0 let height: CGFloat = max(expectedTextSize.height, image.size.width) let size: CGSize = CGSizeMake(width, height) UIGraphicsBeginImageContextWithOptions(size, false, 0) let context: CGContextRef = UIGraphicsGetCurrentContext()! CGContextSetFillColorWithColor(context, color.CGColor) let fontTopPosition: CGFloat = (height - expectedTextSize.height) / 2.0 let textOrigin: CGFloat = (imageAlignment == 0) ? image.size.width + 5 : 0 let textPoint: CGPoint = CGPointMake(textOrigin, fontTopPosition) string.drawAtPoint(textPoint, withAttributes: [NSFontAttributeName: font]) let flipVertical: CGAffineTransform = CGAffineTransformMake(1, 0, 0, -1, 0, size.height) CGContextConcatCTM(context, flipVertical) let alignment: CGFloat = (imageAlignment == 0) ? 0.0 : expectedTextSize.width + 5.0 CGContextDrawImage(context, CGRectMake(alignment, ((height - image.size.height) / 2.0), image.size.width, image.size.height), image.CGImage) let newImage = UIGraphicsGetImageFromCurrentImageContext() UIGraphicsEndImageContext() return newImage } 

Swift 3

 extension UIImage{ class func textEmbededImage(image: UIImage, string: String, color:UIColor, imageAlignment: Int = 0, segFont: UIFont? = nil) -> UIImage { let font = segFont ?? UIFont.systemFont(ofSize: 16.0) let expectedTextSize: CGSize = (string as NSString).size(attributes: [NSFontAttributeName: font]) let width: CGFloat = expectedTextSize.width + image.size.width + 5.0 let height: CGFloat = max(expectedTextSize.height, image.size.width) let size: CGSize = CGSize(width: width, height: height) UIGraphicsBeginImageContextWithOptions(size, false, 0) let context: CGContext = UIGraphicsGetCurrentContext()! context.setFillColor(color.cgColor) let fontTopPosition: CGFloat = (height - expectedTextSize.height) / 2.0 let textOrigin: CGFloat = (imageAlignment == 0) ? image.size.width + 5 : 0 let textPoint: CGPoint = CGPoint.init(x: textOrigin, y: fontTopPosition) string.draw(at: textPoint, withAttributes: [NSFontAttributeName: font]) let flipVertical: CGAffineTransform = CGAffineTransform(a: 1, b: 0, c: 0, d: -1, tx: 0, ty: size.height) context.concatenate(flipVertical) let alignment: CGFloat = (imageAlignment == 0) ? 0.0 : expectedTextSize.width + 5.0 context.draw(image.cgImage!, in: CGRect.init(x: alignment, y: ((height - image.size.height) / 2.0), width: image.size.width, height: image.size.height)) let newImage = UIGraphicsGetImageFromCurrentImageContext() UIGraphicsEndImageContext() return newImage! } }