gpt4 book ai didi

iphone - 为 UIView 自定义 initWithFrame

转载 作者:太空狗 更新时间:2023-10-30 04:00:24 25 4
gpt4 key购买 nike

我正在尝试确定为 UIView 自定义初始化程序的最佳方法,以便可以将一个值传递给初始化程序,并立即将其作为 iVar 存储在 UIView 子类中,因为在drawRect.

目前我正在使用默认的 initWithFrame,然后创建此 UIView 的类将其 iVar 设置为一个值 after 调用 initWithFrame,并且它实际上正在工作; drawRect 以某种方式获取此 iVar 的值,即使它是在 UIView 初始化之后设置的。

所以我需要以下两件事之一:

1) 有信心知道这是可以的:我可以依靠 drawRect 以某种方式延迟绘图,以便在初始化 UIView 后由另一个对象设置 iVars。在这种情况下,只是在 UIView 初始化时调用 drawRect 吗?

或者,

2) 我需要在初始化过程中传递值:这是创建自定义初始化器的最佳方式吗?它需要超过 (CGRect)frame 作为 initWithFrame 的参数。 能不能像这样简单:

 myNewView=[[MyCustomView alloc] initWithFrame:myRect andMore:myValue];

然后在 MyCustomView.m 中:

 - (id)initWithFrame:(CGRect)frame andMore:(int)someValue
{
self = [super initWithFrame:frame];
if (self) {
myIvar=someValue;
... //continue as normal
}
}

这段代码会是一个好方法吗?然后我会轻松地知道在调用 drawRect 之前该值已经存在。

最佳答案

1.) 您可以依靠 drawRect: 在任何 init 之后调用。事实上,drawRect: 将在 View 绘制和合成完成时调用,这通常是核心动画提交的结果(如果您修改任何 CALayer 或 UIView,则在运行循环结束时完成) (始终由 CALayer 支持))。

2.) 从架构的角度来看,这种方法更好。如果你认为这个变量是你的类功能的一个组成部分(没有它这个类就不能正常工作),它绝对应该是一个初始化参数。您还可以考虑在其他 init-Methods 中抛出 NSInternalInconsistencyException(或任何其他异常)和/或将它们标记为已弃用(父类(super class)的 init-Methods 在使用 super initWithFrame: 调用时仍然可以正常工作) .

关于iphone - 为 UIView 自定义 initWithFrame,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/10101431/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com