UIView 内容模式在覆盖 drawRect 时表现不同:

Posted

技术标签:

【中文标题】UIView 内容模式在覆盖 drawRect 时表现不同:【英文标题】:UIView content mode acts differently when override drawRect: 【发布时间】:2016-10-27 04:55:39 【问题描述】:

我正在学习 ios。我一直在阅读 Apple 的 View 编程指南。 我做了以下尝试内容模式:

我将一个 uiview 拖到故事板中,并将其作为我的 CustomView 类。 然后我将内容模式更改为left,并将背景颜色设置为粉红色。 然后有一个按钮,只需将自定义视图的宽度和高度更改为 1.5 倍。

现在,我发现了一件有趣的事情:

我运行这个,然后点击按钮,然后:

案例 1:如果我覆盖了 draw rect 方法

drawRect: overrided

然后视图的外观向下移动

案例 2:不覆盖 draw rect 方法 drawRect: not overrided

大小实际上增加了

在网上做了一些搜索并查看了 Apple 的文档后,除了一个问题提到这可能与 drawLayer:inContext: 如果覆盖 drawRect 时行为不同:

有人知道这里发生了什么吗?

(对不起格式,这是一个新帐户,我不能发布超过 2 个链接。)

代码: 对于 CustomView,只需覆盖 drawRect 或不覆盖它。

#import "CustomView.h"
@implementation CustomView
- (void)drawRect:(CGRect)rect
//Do nothing, for case 2 i just commented out this method.

@end

用于更改 customView 的框架:

- (IBAction)changeBound:(id)sender 
    self.customView.frame = CGRectMake(self.customView.frame.origin.x, self.customView.frame.origin.y, self.customView.frame.size.width * 1.5, self.customView.frame.size.height * 1.5);

【问题讨论】:

用相关代码更新您的问题。 @rmaddy 嗨,我刚刚更新了这个问题。但是我认为代码不会有任何帮助。如果我覆盖 drawRect 方法,当 contentMode 设置为 left 时,我只是对 UIView 的不同行为感到困惑。 这是drawRect:的实际实现吗?真的是空的吗? @rmaddy 是的,这是我对 drawRect 的实现。因为我只是在尝试一些东西。我也尝试过添加 [super drawRect:] 但它的行为仍然不同。我认为只要我覆盖 drawRect,自定义视图的行为就会与 UIView 不同(在这种情况下是背景颜色)。我认为这可能与背景颜色在 UIView 中的实际绘制方式有关。 【参考方案1】:

在做了一些研究之后,我想我知道发生了什么:

所以绘制背景代码实际上是在-(void)drawLayer:(CALayer*)layer inContext:(CGContextRef)context中单独处理的。这就是为什么使用空的drawRect,它仍然绘制背景。此外,根据drawRect 的存在与否(可能通过调用respondsToSelector?),UIView 在drawLayer :inContext 中的行为有所不同。 见Dennis Fan's answer in this link

【讨论】:

以上是关于UIView 内容模式在覆盖 drawRect 时表现不同:的主要内容,如果未能解决你的问题,请参考以下文章

如果 drawRect: 被覆盖,子类化的 UIView 显示黑色背景

在 drawRect 上添加覆盖图像

正确使用 DrawRect 覆盖 - 我可以防止视图拉伸吗?

动画 UIView setFrame 在每个动画帧上强制 drawRect

UIView drawRect 仅在 UITableViewCell 中调用一次,导致重新使用单元格时数据过时

在我的自定义 UIView 中,设置子视图的 backgroundColor 会导致它覆盖我的 drawRect 绘图(CGContextRef、CGMutablePathRef 等)。怎么修?