【问题标题】:drawRect not being called if auto layout enabled如果启用了自动布局,则不会调用 drawRect
【发布时间】:2014-12-17 02:38:58
【问题描述】:

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;
}

这很好用,并且在应用程序的很多地方都得到了使用。

这个项目起源于自动布局出现之前,它在所有单元格 .xib 文件中都是关闭的。

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

LTWItemView.xib - 自动布局关闭。

LTWItemView - 视图类本身。

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

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

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

问题是,如果我启用自动布局,它会导致其他地方出现问题,并且转换项目以使用它的工作量太大。

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

任何关于如何解决这个问题的想法将不胜感激。


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

【问题讨论】:

    标签: ios objective-c xcode autolayout


    【解决方案1】:

    我不完全明白您的问题,但通常需要调用其 drawRectFunction 的视图通常应将其 contentMode 设置为 UIViewContentModeRedraw

    yourView.contentMode = UIViewContentModeRedraw;
    

    【讨论】:

      【解决方案2】:

      无歧义的布局可能会导致这种情况。例如,您指定了 NSLayoutConstraint 的关于视图的垂直放置,但没有说明任何关于水平的内容。 这种情况可能很危险,因为 UIKit 会尽力而为,并至少将视图放置在某个地方,但不会调用 drawRect:。

      【讨论】:

      • 谢谢。对我来说,在添加NSLayoutAttributeWidthNSLayoutAttributeHeight 属性以匹配超级视图后,子视图上突然调用了drawRect:
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多