2015-09-08 5 views
1

I'v получил два вопроса:Путаница UIButton в titleLabel и ImageView собственности

  • Почему button.titleLabel.center равна button.titleLabel.origin и
  • Почему imageView.frame равна нулю?

    UIButton*button=[UIButton buttonWithType:UIButtonTypeCustom]; 
        button.frame=CGRectMake(100, 200, 200, 100); 
        button.backgroundColor=[UIColor whiteColor]; 
        [button setTitle:@"\U0000e602" forState:UIControlStateNormal]; 
        button.font=iconfont; 
        [button setBackgroundImage:[UIImage imageNamed:@"pig.jpg"] forState:UIControlStateNormal]; 
        [button setTitleColor:[UIColor blueColor] forState:UIControlStateNormal]; 
        [self.view addSubview:button]; 
    
        NSLog(@"button.titleLabel.frame%@",NSStringFromCGRect(button.titleLabel.frame)); 
    
        NSLog(@"button.frame%@",NSStringFromCGRect(button.frame)); 
        NSLog(@"button.titleLabel.origin%@\nbutton.titleLabel.center%@",NSStringFromCGPoint(button.titleLabel.frame.origin),NSStringFromCGPoint(button.titleLabel.center)); 
        NSLog(@"button.imageView.frame%@",NSStringFromCGRect(button.imageView.frame)); 
    

И результаты потоков:

2015-09-08 13:27:43.507 IconFontTest[3458:152384] button.titleLabel.frame{{100, 50}, {0, 0}} 
2015-09-08 13:27:43.508 IconFontTest[3458:152384] button.frame{{100, 200}, {200, 100}} 
2015-09-08 13:27:43.508 IconFontTest[3458:152384] button.titleLabel.origin{100, 50} 
button.titleLabel.center{100, 50} 
2015-09-08 13:27:43.509 IconFontTest[3458:152384] button.imageView.frame{{0, 0}, {0, 0}} 
+0

Добро пожаловать в SO! Поскольку вы новичок, вам, вероятно, стоит проверить эту ссылку: http://meta.stackexchange.com/questions/5234/how-does-accepting-an-answer-work/5235#5235 – ZeMoon

ответ

2

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

Посмотрите раздел «Цикл просмотра чертежа» от Apple documentation на UIView. Он упоминается здесь:

Для представлений, которые содержат пользовательский контент с помощью UIKit или Core Graphics, системных вызовов DrawRect вида по: методу. Ваша реализация этот метод отвечает за рисование содержимого представления в текущем графическом контексте , который автоматически настраивается системой до вызова этого метода. Это создает статическое визуальное представление содержимого вашего представления, которое затем может отображаться на экране .

При изменении фактического содержимого вашего просмотра будет сообщение от , чтобы сообщать системе, что ваше мнение должно быть redrawn. Вы делаете это, вызывая метод setNeedsDisplay вашего вида или setNeedsDisplayInRect: метод представления. Эти методы позволяют системе знать, что она должна обновлять представление во время следующего цикла рисования . Поскольку он ожидает следующего цикла рисования, чтобы обновить вид, вы можете вызвать эти методы для нескольких видов, чтобы обновить их в в то же время.

Вы должны вызвать метод setNeedsDisplay непосредственно перед методами журнала:

[button setNeedsDisplay]; 

//Log methods after the above line 

В качестве альтернативы, вы можете попробовать вызвать методы журнала после задержки, скажем, 0,2 секунды, чтобы ждать следующего рисунка цикла к завершено.

dispatch_after(dispatch_time(DISPATCH_TIME_NOW, (int64_t)(0.2 * NSEC_PER_SEC)), dispatch_get_main_queue(), ^{ 
     NSLog(@"button.titleLabel.frame%@",NSStringFromCGRect(button.titleLabel.frame)); 
     NSLog(@"button.frame%@",NSStringFromCGRect(button.frame)); 
     NSLog(@"button.titleLabel.origin%@\nbutton.titleLabel.center%@",NSStringFromCGPoint(button.titleLabel.frame.origin),NSStringFromCGPoint(button.titleLabel.center)); 
     NSLog(@"button.imageView.frame%@",NSStringFromCGRect(button.imageView.frame)); 
    }); 
+0

отлично, но почему бы не изображениеView .frame? все равно ноль –

+0

Маниш прав в своем ответе. Свойство imageView заполняется только тогда, когда вы используете '[button setImage];' Я считаю, что вы не можете получить доступ к UIImageView, в котором отображается фоновое изображение. Вы можете получить доступ только к 'currentBackgroundImage' как UIImage – ZeMoon

-1

button.imageView.frame равен нулю, как вы использовали метод setbackgroundImage:setImage: вместо метода UIButton.

+0

Метод setImage: OK. –

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