我有两个问题:
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 :(得分: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:
方法。