我有一个自定义UIView fooView,在其中已用drawRect方法覆盖了initWithFrame方法。

我也有一个自定义UIView barView,其中包含并包含fooView

由于barView正在绘制自定义内容,因此fooView应该从fooView获得高度。

我的问题是每次我检查fooViewframebounds属性时,它都保持不变。即使我可以清楚地看到它超出了initWithFrame指示的初始高度。

这使我相信,也许自从我重写了drawRect方法之后,现在我就有责任更新fooView的框架。

我应该这样做吗?
我该怎么做?
最佳做法是什么?



编辑:添加代码

- (id)initWithFrame:(CGRect)frame{
    self = [super initWithFrame:frame];
    if (self)   [self setupWithMessage:nil];
    return self;
}


setupWithMessage只是计算文本以适应受限宽度所需的尺寸(主要是高度)。

- (void)drawRect:(CGRect)rect{
    [super drawRect:rect];
//  a whole bunch of drawing logic, but basically draws a message bubble
//  based on the size of the text (The text dynamically changes), and then
//  draws the text so if there is a lot of text, the calculated height of
//  what it takes to draw the text  can easily be larger than the size
//  originally passed in during initialization
}

最佳答案

方法drawInRect:(CGRect)rect给您的矩形不大于您的视框。

因此,如果您绘制的矩形比给定的rect高-您的图形将被剪切。

因此,您应该执行以下步骤:


计算所有尺寸并设置您的fooView框架。
之后,您应该呼叫[fooView setNeedsDisplay]
它将使用新框架调用drawInRect:方法,因此您可以专注于绘图。


如果您的fooView主要任务是从barView中绘制给定的文本,建议您在@property (nonatomic) NSString *textToDraw;类中创建fooView并覆盖设置程序,您将在其中执行上述步骤。

编辑:
如我所见,您为此创建了一个setupWithText:方法。因此,您需要计算所有尺寸,设置框架self.frame = (CGRect){previousX, previousY, newWidth, newHeight}并调用[self setNeedsDisplay];

10-01 03:46