gpt4 book ai didi

iphone - 从 NIB 大小问题加载 UIView 子类

转载 作者:行者123 更新时间:2023-12-03 18:27:13 26 4
gpt4 key购买 nike

我有一个 UIView 的子类,需要根据它的宽度计算它的高度。当用代码创建时,一切正常。但是,当我尝试在界面生成器中创建 View 时,尽管我重写了所有相关方法,但无法获取界面生成器中设置的 View 的大小。

- (id)initWithCoder:(NSCoder *)aDecoder
{
NSLog(@"init with coder before super width %d",super.frame.size.width); // returns 0
self = [super initWithCoder:aDecoder];
NSLog(@"init with coder after super width %d",super.frame.size.width); // still returns 0
}

- (void) awakeFromNib
{
NSLog(@"width of view %d",super.frame.size.width); // Returns 0 as well
}

- (void) setFrame:(CGRect)aFrame
{
[super setFrame:aFrame]; // Called from initWithCoder by super. Correct frame size.
}

所以我的下一个猜测是,也许我的 View 的 super View 正在 awakeFromNib 之后设置我的 View 框架。事实证明并非如此。我在 View 上重写了 setFrame,并在 initWithCoder 期间调用它。

这就是我目前所知道的:

  1. 首先调用 initWithCoder
  2. 在 initWithCoder 期间,发送对 setFrame:(CGRect)aFrame 的调用
  3. 在setFrame中,框架的大小是正确的,我调用[super setFrame:aFrame]
  4. awakeFromNib 被调用
  5. awakeFromNib 中的 super.frame.size.width = 0 self.frame.size.width 也是 0
  6. 当这个过程完成后,看起来 View 比它应该在的位置低了几个像素,但我猜我的代码与尺寸的关系如此集中,这可能是我所做的事情。

任何帮助将不胜感激

最佳答案

如果您扩展 initWithCoder,请务必调用 super 方法。正是在这个 super 调用期间,setFrame 将在您的类上被调用。

然后您可以重新使用标准 initWithFrame 调用。

我总是做以下事情:

- (id)initWithCoder:(NSCoder *)aDecoder {
self = [super initWithCoder:aDecoder]; // Required. setFrame will be called during this method.
return [self initWithFrame:[self frame]];
}

关于iphone - 从 NIB 大小问题加载 UIView 子类,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/3352042/

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