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" (及其所有子视图)在此视图中。这似乎工作正常,解决了我的直接问题,但我很想知道是否有更好的解决方案。
答案 0 :(得分:1)
我没有完全解决您的问题,但通常需要调用其drawRectFunction的视图应该将其contentMode设置为UIViewContentModeRedraw
yourView.contentMode = UIViewContentModeRedraw;
答案 1 :(得分:1)
消歧布局可能会导致这种情况。例如,您指定了NSLayoutConstraint关于视图的垂直位置,但没有说明有关水平的内容。 这种情况可能是危险的,因为UIKit尝试它是最好的并且至少将视图置于某处,但是drawRect:没有被调用。