Note that there are some explanatory texts on larger screens.

plurals
  1. PO
    text
    copied!<p>Yes, there is. </p> <p>The trick is to override <code>-initWithCoder:</code> and the image setters (<code>setImage:forState:</code> and <code>setBackgroundImage:forState:</code>) to create the resizable versions of the same image you set in the xib. Obviously, they still won't resize properly in xib itself, but it will be resized properly after initialization. Don't forget to set <code>NAResizableButton</code> as the custom class of <code>UIButton</code>.</p> <p>Sure beats doing it programmatically. :)</p> <p><strong>Interface:</strong></p> <pre><code>#import &lt;UIKit/UIKit.h&gt; @interface NAResizableButton : UIButton @end </code></pre> <p><strong>Implementation:</strong></p> <pre><code>#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 </code></pre>
 

Querying!

 
Guidance

SQuiL has stopped working due to an internal error.

If you are curious you may find further information in the browser console, which is accessible through the devtools (F12).

Reload