2012-02-07 6 views
0

Я новичок в подклассе, но мне нужен подкласс UILabel, чтобы дать какой-либо текст внутри метки иметь трехпиксельный контур. Из this page, я использовал этот метод:iOS - Доступ к новым свойствам в подклассе

- (void)drawTextInRect:(CGRect)rect 
{  
    CGSize shadowOffset = self.shadowOffset; 
    UIColor *textColor = self.textColor;  

    CGContextRef c = UIGraphicsGetCurrentContext(); 

    CGContextSetLineWidth(c, 3); 
    CGContextSetLineJoin(c, kCGLineJoinRound);  
    CGContextSetTextDrawingMode(c, kCGTextStroke); 
    self.textColor = [UIColor whiteColor]; 
    [super drawTextInRect:rect];  

    CGContextSetTextDrawingMode(c, kCGTextFill); 
    self.textColor = textColor; 

    self.shadowOffset = CGSizeMake(0, 0); 
    [super drawTextInRect:rect]; self.shadowOffset = shadowOffset; 
} 

Это прекрасно работает, и я могу изменить цвета для отображения любого цвета я хотел бы как для текста и контура.

Может ли кто-нибудь дать мне знать, как создать свойство под названием «outlineColor», которое позволит мне установить этот подкласс на любой ярлык, который я хочу, и изменить цвет контура?

По сути, я хотел бы быть в состоянии установить классу, состоящему лейбла к «CustomLabelClass», а затем в какой-то другой класс, я хотел бы сказать что-то вроде:

[myLabel setOutlineColor:[UIColor whiteColor]]; 

Я не знаю, как обойти это. Благодарю.

ответ

1

Я сделал то же самое в своем коде. Я создал подкласс UILabel со свойствами, чтобы установить цвет границы и ширину границы.

JKBorderedLabel.h

@interface JKBorderedLabel : UILabel 

@property (nonatomic, retain) UIColor *borderColor; 
@property (nonatomic) NSInteger borderWidth; 

@end 

JKBorderedLabel.m

#import "JKBorderedLabel.h" 

@implementation JKBorderedLabel 

@synthesize borderColor = _borderColor; 
@synthesize borderWidth = _borderWidth; 

- (void)drawTextInRect:(CGRect)rect { 

    CGSize shadowOffset = self.shadowOffset; 
    UIColor *textColor = self.textColor; 

    self.shadowOffset = CGSizeMake(0, 0); 

    CGContextRef c = UIGraphicsGetCurrentContext(); 
    CGContextSetLineWidth(c, _borderWidth); 
    CGContextSetLineJoin(c, kCGLineJoinRound); 

    CGContextSetTextDrawingMode(c, kCGTextStroke); 
    self.textColor = _borderColor; 
    [super drawTextInRect:rect]; 

    CGContextSetTextDrawingMode(c, kCGTextFill); 
    self.textColor = textColor; 
    [super drawTextInRect:rect]; 

    self.shadowOffset = shadowOffset; 
} 

- (void)sizeToFit 
{ 
    [super sizeToFit]; 

    self.frame = CGRectMake(self.frame.origin.x, 
           self.frame.origin.y - _borderWidth, 
           self.frame.size.width + (_borderWidth * 2), 
           self.frame.size.height); 
} 

@end 

И затем использовать:

JKBorderedLabel *myLabel = [[JKBorderedLabel alloc] init]; 

myLabel.text = @"Hello World"; 
myLabel.textColor = [UIColor whiteColor]; 
myLabel.borderColor = [UIColor blueColor]; 
myLabel.borderWidth = 4; 
[myLabel sizeToFit]; 
+0

Спасибо! Я думал, что я пробовал что-то подобное этому, но в других классах, когда я набрал «[myLabel», опция «setOutlineColor» никогда не появлялась. Однако я установил класс в Interface Builder, а не инициализировал его с помощью кода. Может быть, это была проблема, как вы думаете? – achiral

+0

Возможно. Я не пробовал использовать это через IB, но, предполагая, что класс объекта установлен на ваш пользовательский класс в Identity Inspector, я думаю, он должен работать. – jonkroll

Смежные вопросы