2012年12月22日 星期六

iOS內如何寫出一個有Background Image的Label, Part 2

繼續前一篇文章內提到的有背景圖片的UILabel的實作方式,這一次試著直接subclass UILabel,然後加入padding以及background image的屬性設定.


// 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是否還必須處理以下的狀況?
  1. 有沒有可能setBackgroundImage時ImageLabel的frame size還沒有被設好?
  2. ImageLabel如果被resize的話,那該怎麼處理?
這個就等待下次有空時再來研究了。




沒有留言:

張貼留言