0

TNContainer是 UIView 的子类,我正在执行以下drawRect方法

#import "ViewController.h"

@interface ViewController ()

@end

@implementation ViewController

- (void)viewDidLoad
{
    [super viewDidLoad];
    [self.navigationBar setBackgroundImage:[UIImage imageNamed: @"UINavigationBarBlackOpaqueBackground.png"]
                                       forBarMetrics:UIBarMetricsDefault];
    self.containerView      =   [[TNContainer alloc] initWithFrame:CGRectMake(0, 0, 100, 10)];
    self.navigationBar.topItem.titleView    =   self.containerView;

}

在我的TNContainer.m,我正在做(放置一些语句来打印出边界和框架)

#import "TNContainer.h"

@implementation TNContainer

- (id)initWithFrame:(CGRect)frame {
    if (self = [super initWithFrame:frame]) {
        // Initialization code
    }
    NSLog(@"frame at initWithFrame is %@", NSStringFromCGRect(self.frame));
    NSLog(@"bound at initWithFrame is %@", NSStringFromCGRect(self.bounds));
    return self;
}

-(void) drawRect:(CGRect)rect{
    [super drawRect:rect];
    NSLog(@"frame at drawRect is %@", NSStringFromCGRect(self.frame));
    NSLog(@"bounds at drawRect is %@", NSStringFromCGRect(self.bounds));

    CGRect rectangle        = self.bounds;
    CGContextRef context    = UIGraphicsGetCurrentContext();
    CGContextSetFillColorWithColor(context, [UIColor orangeColor].CGColor);
    CGContextSetStrokeColorWithColor(context, [UIColor whiteColor].CGColor);
    CGContextFillRect(context, rectangle);
}

非常有趣的是,框架的边界initWithFramedrawRect完全不同

2013-09-25 16:19:47.926 TNSegmentController[10458:a0b] frame at initWithFrame is {{0, 0}, {100, 10}}
2013-09-25 16:19:47.928 TNSegmentController[10458:a0b] bound at initWithFrame is {{0, 0}, {100, 10}}
2013-09-25 16:19:47.934 TNSegmentController[10458:a0b] frame at drawRect is {{110, 17}, {100, 10}}
2013-09-25 16:19:47.934 TNSegmentController[10458:a0b] bounds at drawRect is {{0, 0}, {100, 10}}

为什么我要{{110, 17}, {100, 10}}drawRect()......

有什么想法吗?

4

2 回答 2

2

这一点都不奇怪——事实上,这是意料之中的。有时-initWithFrame:,您传入一个带有 origin 的框架(0,0)。该框架已正式记录在您的 UIView 子类中。

但是,当该视图开始绘制时,您已将其分配为titleView导航栏;该栏可能已将您的视图添加为自己的子视图并将其重新定位为居中。您的第一个绘图请求直到所有这些都发生后才会出现,这就是为什么您会看到不同的来源(110,17)- 在您的-drawRect:覆盖中。

(你会注意到你的原始大小被保留了,我想这是你真正关心的事情。改变视图的原点 - 因此框架 - 是使用自定义标题视图的理想行为。)

于 2013-09-25T20:36:10.483 回答
0

因为“界限”是与自身相关的。“框架”是对其在超级视图中位置的引用。正如@Tim 提到的,如果超级视图改变了位置,“框架”值会改变,但内部“边界”不会改变,假设超级视图没有调整大小。

于 2013-09-25T20:45:32.963 回答