如果启用了自动布局,则不会调用drawRect

时间:2014-07-30 17:41:42

标签: ios objective-c xcode autolayout

XCode 5,Mac OS 10.9.4,iOS 7。

我正在开发一个项目,该项目使用大量视图“单元格”进入滚动和表格视图。每个“单元格”视图都在单独的.xib文件中,并加载如下:

+(instancetype) newViewOfKind:(NSString*) theViewKind withItemInfo:(LTWItemInfo*) theItemInfo
{
NSString*   myClassName;
LTWItemView*    myNewCell;

myClassName = NSStringFromClass([self class]);
myNewCell = [[super class] newViewOfKind:theViewKind withItemInfo:theItemInfo andNIBBaseName:myClassName];

if (myNewCell.pItemActivityIndicator != nil)
    myNewCell.pItemActivityIndicator.hidesWhenStopped = YES;

myNewCell.pItemDownloadImageLoadedFlag = NO;
myNewCell.pItemDownloadImage = nil;
[myNewCell setItemInfo:theItemInfo];

return myNewCell;
}

这很好用,并且正在App中的很多地方使用。

这个项目是在Auto-Layout出现之前发起的,它在所有单元格.xib文件中都是关闭的。

每个视图的.xib文件都有一个“标准”布局,如​​下所示:

LTWItemView.xib - 关闭自动布局。

LTWItemView - 视图类本身。

LTWItemView的子视图:“FrameRect” - 类“LTWDrawFrameView”的视图(这是一个普通视图,但是drawRect被覆盖以在视图周围绘制一个框架。)

“FrameRect”视图的子视图,其他视图UILabels,UIImageView,UIButton等等。

问题是“FrameRect”中的drawRect方法没有被调用,它的背景颜色也没有被设置。当我第一次创建此视图时,我错误地启用了自动布局,在这种情况下,背景颜色设置为ok并调用drawRect。我已经验证了这一点。

问题在于,如果我启用自动布局,则会导致其他地方出现问题,将项目转换为使用它的工作太大了。

此外,在某些“FrameRect”视图中,还有其他较小的LTWDrawFrameView,它们绘制框架并将其背景颜色设置为正常。看起来它似乎不适用于从笔尖加载的视图中的第一个子视图。

如何解决这个问题的任何想法都将非常感激。


我通过添加"虚拟"来解决这个问题。查看.xib文件中单元格视图的第一个子视图,并放置" FrameRect" (及其所有子视图)在此视图中。这似乎工作正常,解决了我的直接问题,但我很想知道是否有更好的解决方案。

2 个答案:

答案 0 :(得分:1)

我没有完全解决您的问题,但通常需要调用其drawRectFunction的视图应该将其contentMode设置为UIViewContentModeRedraw

yourView.contentMode = UIViewContentModeRedraw;

答案 1 :(得分:1)

消歧布局可能会导致这种情况。例如,您指定了NSLayoutConstraint关于视图的垂直位置,但没有说明有关水平的内容。 这种情况可能是危险的,因为UIKit尝试它是最好的并且至少将视图置于某处,但是drawRect:没有被调用。