关于UIButton的titleLabel和imageView属性的混淆

时间:2015-09-08 06:02:18

标签: ios objective-c uiimageview uibutton frame

我有两个问题:

  • 为什么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}}

2 个答案:

答案 0 :(得分:2)

在设置视图时,视图不会立即呈现。在记录其框架属性之前,您需要等待下一个图形更新。

在UIView上查看Apple documentation的“查看绘图周期”部分。这里提到:

  

对于包含使用UIKit或Core Graphics的自定义内容的视图,   系统调用视图的drawRect:方法。你的实施   此方法负责将视图的内容绘制到   当前图形上下文,由系统自动设置   在调用此方法之前。这会创建静态视觉效果   表示您可以在其上显示的视图内容   屏幕。

     

当视图的实际内容发生变化时,它就是您的   有责任通知系统您的视图需要   重绘。您可以通过调用视图的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));
    });

答案 1 :(得分:-1)

button.imageView.frame为零,因为您使用了setbackgroundImage:方法而不是UIButton的setImage:方法。