2013-04-18 3 views
0

Я пытаюсь просмотреть информацию о 3 разных таблицах; Первый. Заголовок Два. Дата выпуска Три. ОписаниеUILabel - выпуск с гибкими размерами и фиксированным размером

Между названием и датой выпуска есть две пустые строки. Иногда, когда название получает более 3 строк, записывается на дату публикации. вот картинка (жирная линия метка даты паба): title gets on pubDate

, а иногда, когда описание этикетки получить большое количество текста вот что случилось: enter image description here

это как его должно быть:

enter image description here

так вопросы: 1. Как я могу сохранить фиксированное пространство между заголовком и публикой? (независимо от того, сколько строк заголовок останется между двумя фиксированным пространством) 2. Почему описание перемещается вниз, когда он получает большое количество текста? как я могу исправить его место?

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

вот мой код до сих пор:

- (void)viewDidLoad 
{ 


    [super viewDidLoad]; 

    [_scroller setScrollEnabled:YES]; 
    [_scroller setContentSize:CGSizeMake(320, 600)]; 


    self.lblDescription.text = self.description; 
    self.lblTitle.text = self.stitle; 
    self.lblPubDate.text = self.pubDate; 


    self.lblTitle.numberOfLines = 0; 
    [self.lblTitle sizeToFit]; 
    self.lblTitle.textAlignment = UITextAlignmentRight; 
    CGRect titleFram = self.lblTitle.frame; 
    titleFram = CGRectMake(titleFram.origin.x, titleFram.origin.y, 280, titleFram.size.height); 
    self.lblTitle.frame = titleFram; 

    self.lblDescription.numberOfLines = 0; 
    [self.lblDescription sizeToFit]; 

    [self resizeHeightToFitForLabel:self.lblTitle]; 
    [self resizeHeightToFitForLabel:self.lblDescription]; 


} 
-(void)resizeHeightToFitForLabel:(UILabel *)label 
{ 
    CGRect newFrame   = label.frame; 
    newFrame.size.height = [self heightForLabel:label withText:label.text]; 
    label.frame    = newFrame; 
} 

-(CGFloat)heightForLabel:(UILabel *)label withText:(NSString *)text 
{ 
    CGSize maximumLabelSize  = CGSizeMake(290, FLT_MAX); 

    CGSize expectedLabelSize = [text sizeWithFont:label.font 
            constrainedToSize:maximumLabelSize 
             lineBreakMode:label.lineBreakMode]; 

    return expectedLabelSize.height; 
} 

, что это лучший способ, чтобы получить это сделать? спасибо ..

ответ

1

Попробуйте это,

- (void)viewDidLoad 
{ 
    [super viewDidLoad]; 

    [_scroller setScrollEnabled:YES]; 
    [_scroller setContentSize:CGSizeMake(320, 600)]; 

    //Use this way 
    [self positionLabel:self.lblTitle withText:self.stitle withY:10]; 
    [self positionLabel:self.lblPubDate withText:self.pubDate withY:CGRectGetMaxY(self.lblTitle.frame)+10 ]; 
    [self positionLabel:self.lblDescription withText:self.description withY:CGRectGetMaxY(SELF.lblPubDate.frame)+10 ]; 

} 

-(void)positionLabel:(UILabel*)lbl withText:(NSString*)text withY:(CGFloat)Y 
{ 
    lbl.textAlignment = UITextAlignmentRight; 
    lbl.text = text; 
    lbl.numberOfLines = 0; 
    lbl.lineBreakMode = NSLineBreakByWordWrapping; 
    CGSize size = [self calculateSize:lbl]; 
    //FIXED 
    [lbl setFrame:CGRectMake(10 , Y , (size.width>310)?size.width:310 , size.height)]; 
} 

-(CGSize)calculateSize:(UILabel*)lbl 
{ 
    CGSize size = [lbl.text sizeWithFont:lbl.font 
         constrainedToSize:CGSizeMake(310, MAXFLOAT) 
          lineBreakMode:UILineBreakModeWordWrap]; 
    return size; 
} 
+0

все ярлыки выходят из рамок зрения .. только когда им прокручиваю, я вижу их .. pubDate не выравнивается справа, но все выглядит нормально .. как я могу это исправить ? – OshriALM

+0

@OhriALM Я исправил его. См. Обновленный ответ. –

+0

все еще не в порядке .. – OshriALM

0

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

(float) calculateHeightOfTextFromWidth:(NSString*) text: (UIFont*)withFont: (float)width :(UILineBreakMode)lineBreakMode 
{ 
[text retain]; 
[withFont retain]; 
CGSize suggestedSize = [text sizeWithFont:withFont constrainedToSize:CGSizeMake(width, FLT_MAX) lineBreakMode:lineBreakMode]; 

[text release]; 
[withFont release]; 

return suggestedSize.height; 
} 

и использовать его как сильфон ..

UILabel *lblAddress = [[UILabel alloc]init]; 
[lblAddress setFrame:CGRectMake(110, 31, 200, 50)];   
lblAddress.text = @"your Text "; 
lblAddress.lineBreakMode = UILineBreakModeWordWrap; 
lblAddress.numberOfLines = 0; 
lblAddress.font = [UIFont fontWithName:@"Helvetica" size:12]; 

lblAddress.frame = CGRectMake(lblAddress.frame.origin.x, lblAddress.frame.origin.y, 
         200,[self calculateHeightOfTextFromWidth:lblAddress.text :lblAddress.font :200 :UILineBreakModeWordWrap]); 

lblAddress.textColor = [UIColor darkGrayColor]; 

[self.view addSubview:lblAddress]; 

Смотреть My Blog ...

+0

применять этот специальный метод для каждого из моих лейблов? – OshriALM

+0

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

+0

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

0

попробуйте это

self.lblDescription.text = @"asdfasfadfsa"; 
    self.lblTitle.text = @"asdafsasf"; 
    self.lblPubDate.text = @"asdafsas"; 


    self.lblTitle.numberOfLines = 0; 
    [self.lblTitle sizeToFit]; 
    self.lblTitle.textAlignment = UITextAlignmentRight; 
    CGRect titleFram = self.lblTitle.frame; 
    titleFram = CGRectMake(titleFram.origin.x, titleFram.origin.y, 280, titleFram.size.height); 
    self.lblTitle.frame = titleFram; 

    self.lblDescription.numberOfLines = 0; 
    [self.lblDescription sizeToFit]; 

    [self resizeHeightToFitForLabel:self.lblTitle]; 

    CGRect pubFrame =self.lblPubDate.frame; 
    pubFrame.origin.y= self.lblTitle.frame.origin.y+self.lblTitle.frame.size.height+110; 

    [self.lblPubDate setFrame:pubFrame]; 

    CGRect descFrame =self.lblDescription.frame; 
    descFrame.origin.y= self.lblPubDate.frame.origin.y+self.lblPubDate.frame.size.height+30; 


    [self resizeHeightToFitForLabel:self.lblDescription]; 
+0

hmm .. не работает название сейчас находится в описании .. – OshriALM

2

Вы можете попробовать этот способ,

NSString *lbltext1 = lblTitle.text; 
    NSString *lbltext2 = lblDate.text; 
    NSString *lbltext3 = lblDesc.text; 

CGRect rect = self.lblTitle.frame; 
rect.size.height = [ViewController calculateHeightForText:lbltext1 font:self.lblTitle.font size:CGSizeMake(rect.size.width, 40000)].height; 
self.lblTitle.frame = rect; 

rect = self.lblDate.frame; 
rect.origin.y = CGRectGetMaxY(self.lblTitle.frame) + 5; 
rect.size.height = [ViewController calculateHeightForText:lbltext2 font:self.lblDate.font size:CGSizeMake(rect.size.width, 40000)].height; 
self.lblDate.frame = rect; 

rect = self.lblDesc.frame; 
rect.origin.y = CGRectGetMaxY(self.lblDate.frame) + 5; 
rect.size.height = [ViewController calculateHeightForText:lbltext3 font:self.lblDesc.font size:CGSizeMake(rect.size.width, 40000)].height; 
self.lblDesc.frame = rect; 

по высоте caculate,

+ (CGSize)calculateHeightForText:(NSString *)text font:(UIFont *)font size:(CGSize)size { 
    CGSize _size = [text sizeWithFont:font constrainedToSize:size lineBreakMode:UILineBreakModeWordWrap]; 
    return _size; 
} 
+0

этот код исправил мою 1-ю проблему .. независимо от того, сколько строк название есть пробел между заголовком и PudDate .. , но описание все еще не имеет фиксированное место .. – OshriALM

+0

что вы делаете для этого? –

+0

Есть ли у вас какие-либо предложения? – OshriALM

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