我有一个自定义UIView fooView
,在其中已用drawRect
方法覆盖了initWithFrame
方法。
我也有一个自定义UIView barView
,其中包含并包含fooView
。
由于barView
正在绘制自定义内容,因此fooView
应该从fooView
获得高度。
我的问题是每次我检查fooView
的frame
或bounds
属性时,它都保持不变。即使我可以清楚地看到它超出了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];