2013-12-09 3 views
2

Я использую UILabel и NSAttributedString для установки строк для текстов меток в IOS7. Но когда я использую это, текст не кажется выровненным по центру на ярлыке. Вот мой код, чтобы установить текст (приписываемый) метке.Как вертикально выравнивать текст с использованием UILabel и NSAttributedString

-(void)setText:(NSString *)text 
{ 
    [super setText:text]; 

    if(text) 
     [self setLineSpace]; 
} 
-(void)setLineSpace 
{ 
    if([[[UIDevice currentDevice] systemVersion] floatValue] >= 7) 
    { 
     NSMutableAttributedString *string=[[NSMutableAttributedString alloc]initWithString:self.text]; 

     NSMutableParagraphStyle *paragraphStyle = [[NSMutableParagraphStyle defaultParagraphStyle] mutableCopy]; 
     paragraphStyle.alignment=NSTextAlignmentJustified; 
     [paragraphStyle setLineSpacing:4] ; 
//  paragraphStyle.minimumLineHeight =0; 
//  paragraphStyle.maximumLineHeight=7; 
    // CTTextAlignment alignment = kCTCenterTextAlignment; 
     [string addAttribute:NSParagraphStyleAttributeName value:paragraphStyle range:NSMakeRange(0, string.length)]; 
     self.text=nil; 
     self.attributedText=string; 

     [self setBackgroundColor:[UIColor redColor]]; 

    } 

} 

Вот некоторые скриншоты, BTW утра подклассов UILabel до и перекрывая сеттер для реализации LineSpacing.

enter image description here

+1

Что вы хотите? – preetam

+0

@preetam Я хочу, чтобы выровнять строки. Посмотрите, что новости о скриншотах больше совпадают с «вверх-частью» метки /. – Raon

+0

Ну, вам нужно только UILabel, я имею в виду, если вы можете использовать UITextField, а затем внутри xib, он обеспечивает контрольный раздел там вы можете напрямую изменить выравнивание текста без написания кода –

ответ

2

На самом деле я решил это .... :) :). Проблема заключалась в использовании пользовательского шрифта, который я использовал.

Потребовалось некоторое R & D, но теперь, кажется, работает

Просто создал подкласс для этикетки и переопределить некоторые методы по умолчанию.

- (CGRect)textRectForBounds:(CGRect)bounds limitedToNumberOfLines:(NSInteger)numberOfLines 
{ 

    CGRect textRect = [super textRectForBounds:bounds limitedToNumberOfLines:numberOfLines]; 

    if(([self.font.fontName isEqualToString:@"Gotham"]||[self.font.fontName isEqualToString:@"Gotham-Bold"]||[self.font.fontName isEqualToString:@"Gotham-Medium"])&&((int)[[[UIDevice currentDevice] systemVersion] floatValue])==6&&self.verticalAlignment==AlignMiddle) 
    { 
     textRect.origin.y = bounds.origin.y + (bounds.size.height - textRect.size.height)/2.0; 
     return [self addToRect:textRect x:0 y:2]; 
    } 
    return [self addToRect:textRect x:0 y:0.5]; 
} 

-(void)drawTextInRect:(CGRect)requestedRect 
{ 
    if(((int)[[[UIDevice currentDevice] systemVersion] floatValue])>=7) 
     [super drawTextInRect:[self addToRect:requestedRect x:0 y:0.5]]; 
    else 
    { 
     CGRect actualRect = [self textRectForBounds:requestedRect limitedToNumberOfLines:self.numberOfLines]; 
     [super drawTextInRect:actualRect]; 
    } 
} 
-(CGRect)addToRect:(CGRect)rect x:(CGFloat)dx y:(CGFloat) dy 
{ 
    rect=CGRectMake(rect.origin.x+dx, rect.origin.y+dy, rect.size.width, rect.size.height); 
    return rect; 
} 
-(CGRect)makeRect:(CGRect)rect x:(CGFloat)dx y:(CGFloat) dy 
{ 
    rect=CGRectMake(dx,dy, rect.size.width+dx, rect.size.height+dy); 
    return rect; 
} 
-(CGRect)makeRects:(CGRect)rect x:(CGFloat)dx y:(CGFloat) dy 
{ 
    rect=CGRectMake(rect.origin.x,rect.origin.y, rect.size.width+dx, rect.size.height+dy); 
    return rect; 
} 
-(void)truncateToFit 
{ 
    if([[[UIDevice currentDevice] systemVersion] floatValue] < 7) 
    { 
     [self sizeToFit]; 
     CGRect frame=self.frame; 
    if(frame.size.height<self.frame.size.height) 
     self.frame=[self makeRects:frame x:0 y:0.5]; 
    } 
    else 
    { 
     self.frame=[self makeRects:self.frame x:0 y:0.5]; 
     [self sizeToFit]; 
    } 
} 

-(void)truncatesToFit 
{ 
    self.lineBreakMode=NSLineBreakByTruncatingTail; 

     self.numberOfLines=2; 
     [self sizeToFit]; 
     self.frame=[self makeRects:self.frame x:0 y:0.5]; 
} 




-(void)truncatesToFit:(NSInteger)linesCount 

{ 

    self.numberOfLines=linesCount; 

    [self sizeToFit]; 

    self.frame=[self makeRects:self.frame x:0 y:0.5]; 

} 
0

Вы можете использовать другие обходной путь - обычай UILabel

NWLabel.m

#import "NWLabel.h" 

@implementation NWLabel 

- (id)initWithFrame:(CGRect)frame 
{ 
self = [super initWithFrame:frame]; 
if (!self) return nil; 

_verticalAlignment = VerticalAlignmentTop; 

return self; 
} 


-(VerticalAlignment) verticalAlignment 
{ 
return _verticalAlignment; 
} 

-(void) setVerticalAlignment:(VerticalAlignment)value 
{ 
_verticalAlignment = value; 
[self setNeedsDisplay]; 
} 

// align text block according to vertical alignment settings 
-(CGRect)textRectForBounds:(CGRect)bounds limitedToNumberOfLines:(NSInteger)numberOfLines 
{ 
CGRect rect = [super textRectForBounds:bounds limitedToNumberOfLines:numberOfLines]; 
CGRect result; 
switch (_verticalAlignment) 
{ 
    case VerticalAlignmentTop: 
     result = CGRectMake(bounds.origin.x, bounds.origin.y, rect.size.width, rect.size.height); 
     break; 
    case VerticalAlignmentMiddle: 
     result = CGRectMake(bounds.origin.x, bounds.origin.y + (bounds.size.height - rect.size.height)/2, rect.size.width, rect.size.height); 
     break; 
    case VerticalAlignmentBottom: 
     result = CGRectMake(bounds.origin.x, bounds.origin.y + (bounds.size.height - rect.size.height), rect.size.width, rect.size.height); 
     break; 
    default: 
     result = bounds; 
     break; 
} 
return result; 
} 

-(void)drawTextInRect:(CGRect)rect 
{ 
CGRect r = [self textRectForBounds:rect limitedToNumberOfLines:self.numberOfLines]; 
[super drawTextInRect:r]; 
} 

NWLabel.h

#import <UIKit/UIKit.h> 

typedef enum 
{ 
VerticalAlignmentTop = 0, // default 
VerticalAlignmentMiddle, 
VerticalAlignmentBottom, 
} VerticalAlignment; 

@interface NWLabel : UILabel 
{ 
    @private VerticalAlignment _verticalAlignment; 
} 

@property (nonatomic, readwrite, assign) VerticalAlignment verticalAlignment; 


@end 
+0

Это тоже не работает, мне также пришлось вручную написать код для горизонтального выравнивания – Raon

+0

Оригинальный ответ здесь отправлен @ ivan.m. . И работал на меня https://discussions.apple.com/thread/1759957?tstart=0 –

1

Вероятно, вы не можете это сделать с UILabel простым способом.

Если возможно, вы можете использовать UITextField для вертикального выравнивания содержимого.

Else, используя NSAttributedString и текст метки, вы можете настроить Line-Height (Не уверен).

0

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

+0

, к сожалению, мне нужен интервал между строками – Raon

+0

Потому что вы повторно используете этот код для других ярлыков? – bilobatum

+0

ye ios 7 не имеет межстрочного интервала nyc (по умолчанию), поэтому мне нужно предоставить это вручную .. :( – Raon

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