UIImage resizableImageWithCapInsets: ¿se puede especificar con una punta?

Tengo un UIImage networkingimensionando perfectamente usando resizableImageWithCapInsets para hacer una insignia que contiene una label de text. Me interesa saber si hay alguna forma de hacerlo en un storyboard o en una vista creada con una punta.

No hay ninguna razón técnica para exigir esto. La mayor parte de la interfaz de usuario se realiza en la punta y me gustaría mantener todo lo posible allí en lugar de cargar la image, hacer que sea networkingimensionable, encontrar las dimensiones del text, cambiar el tamaño de UIImageView y luego aplicar la label en el código.

No puedo hacer este proyecto solo para iOS6 (destino de deployment ios5 +), por lo que usar restricciones de layout no es una opción.

Sí hay.

El truco es anular -initWithCoder: y los -initWithCoder: imágenes ( setImage:forState: y setBackgroundImage:forState: para crear las versiones networkingimensionables de la misma image que configuró en el xib. Obviamente, aún no cambiarán el tamaño correctamente en xib en sí, pero cambiarán de tamaño correctamente después de la initialization. No olvide establecer NAResizableButton como la class personalizada de UIButton .

Claro que lo hace programáticamente. 🙂

Interfaz:

 #import <UIKit/UIKit.h> @interface NAResizableButton : UIButton @end 

Implementación:

 #import "NAResizableButton.h" @implementation NAResizableButton - (id)initWithCoder:(NSCoder *)aDecoder { self = [super initWithCoder:aDecoder]; if (self) { [self setImage:[self imageForState:UIControlStateNormal] forState:UIControlStateNormal]; [self setImage:[self imageForState:UIControlStateHighlighted] forState:UIControlStateHighlighted]; [self setImage:[self imageForState:UIControlStateSelected] forState:UIControlStateSelected]; [self setImage:[self imageForState:UIControlStateDisabled] forState:UIControlStateDisabled]; [self setBackgroundImage:[self backgroundImageForState:UIControlStateNormal] forState:UIControlStateNormal]; [self setBackgroundImage:[self backgroundImageForState:UIControlStateHighlighted] forState:UIControlStateHighlighted]; [self setBackgroundImage:[self backgroundImageForState:UIControlStateSelected] forState:UIControlStateSelected]; [self setBackgroundImage:[self backgroundImageForState:UIControlStateDisabled] forState:UIControlStateDisabled]; } return self; } - (void)setImage:(UIImage *)inImage forState:(UIControlState)inState { UIEdgeInsets edgeInsets = UIEdgeInsetsMake(ceilf(inImage.size.height / 2), ceilf(inImage.size.width / 2), ceilf(inImage.size.height / 2), ceilf(inImage.size.width / 2)); if ([inImage respondsToSelector:@selector(resizableImageWithCapInsets:)]) { // iOS 5 inImage = [inImage resizableImageWithCapInsets:edgeInsets]; } else inImage = [inImage stretchableImageWithLeftCapWidth:edgeInsets.left topCapHeight:edgeInsets.top]; [super setImage:inImage forState:inState]; } - (void)setBackgroundImage:(UIImage *)inImage forState:(UIControlState)inState { UIEdgeInsets edgeInsets = UIEdgeInsetsMake(ceilf(inImage.size.height / 2), ceilf(inImage.size.width / 2), ceilf(inImage.size.height / 2), ceilf(inImage.size.width / 2)); if ([inImage respondsToSelector:@selector(resizableImageWithCapInsets:)]) { // iOS 5 inImage = [inImage resizableImageWithCapInsets:edgeInsets]; } else inImage = [inImage stretchableImageWithLeftCapWidth:edgeInsets.left topCapHeight:edgeInsets.top]; [super setBackgroundImage:inImage forState:inState]; } @end