// ImageLabel.h
//
@interface ImageLabel : UILabel
// Text Padding
//
@property (nonatomic, assign) UIEdgeInsets insets;
- (void) setBackgroundImage:(UIImage*) image;
@end
// ImageLabel.m
//
#import "ImageLabel.h"
@implementation ImageLabel
@synthesize insets = _insets;
- (void)drawTextInRect:(CGRect)rect
{
return [super drawTextInRect:UIEdgeInsetsInsetRect(rect, self.insets)];
}
- (void)setBackgroundImage:(UIImage *)image
{
CGRect rect = self.bounds;
UIImage* imageScaled = [self imageWithImage:image scaledToSize:rect.size];
self.backgroundColor = [UIColor colorWithPatternImage:imageScaled];
imageScaled = nil;
}
- (UIImage*)imageWithImage:(UIImage*)image
scaledToSize:(CGSize)newSize;
{
UIGraphicsBeginImageContext( newSize );
[image drawInRect:CGRectMake(0,0,newSize.width,newSize.height)];
UIImage* newImage = UIGraphicsGetImageFromCurrentImageContext();
UIGraphicsEndImageContext();
return newImage;
}
@end
另外在controller內,放入一個UILabel物件,然後把它的base class改成ImageLabel,接著在viewDidLoad內,設定UILabel的屬性:
// Initialize result label
//
- (void)initResultLabel
{
// Stretch the image with 1x1 caps on each side
//
UIImage* imageBackground = [[UIImage imageNamed:@"Rez/iPhone/bg-display.png"] stretchableImageWithLeftCapWidth:1 topCapHeight:1];
[_resultLabel setBackgroundImage:imageBackground];
imageBackground = nil;
_resultLabel.insets = UIEdgeInsetsMake(2, 4, 2, 4);
}
這樣子的效果就跟原先的設計一樣,而且更簡潔。
上述程式碼雖然可行,不過我還不確定ImageLabel是否還必須處理以下的狀況?
- 有沒有可能setBackgroundImage時ImageLabel的frame size還沒有被設好?
- ImageLabel如果被resize的話,那該怎麼處理?
沒有留言:
張貼留言