【问题标题】:add View loaded from xib into a UIScrollview将从 xib 加载的视图添加到 UIScrollview
【发布时间】:2012-12-28 12:10:02
【问题描述】:

我正在尝试将通过 xib 文件创建的视图添加到 UIScrollview 中。

视图如下所示:

我得到的是:

我用来将视图添加到 UIScrollview(在 Storyboard 中设置)的代码是:

初始化代码:

NSArray *subviewArray = [[NSBundle mainBundle] loadNibNamed:@"SpuelungProtokollView" owner:self options:nil];
HPSpuelungProtokollView * spuelungProtokollView = [subviewArray objectAtIndex:0];
HPSpuelung * vInfo = pInfo;

// setup Infos
// ... this part is not related to the problem ...

[self setContentView:spuelungProtokollView];

然后我在viewDidLoad: 中执行以下操作:

[[self scrollView] setContentSize:[[self contentView] frame].size];
[[self scrollView] addSubview:[self contentView]];
[[self contentView] layoutIfNeeded];

有没有人遇到过类似的问题 - 知道如何正确地将(适当的约束)UIView 添加到 UIScrollview?

提前感谢您的回答!

编辑

一个奇怪的副作用是:如果我在viewDidAppear: 中创建视图层次结构,则视图加载正确

【问题讨论】:

  • 你的 awakeFromNib 是什么样子的?
  • 我没有 - 这个功能有什么用?抱歉,直到现在我才用 xib 做一个 nOOb,我用故事板做了所有我从未使用过这种方法的事情
  • 我添加了一个答案,阅读了苹果开发网站上的协议,他们也有例子。祝你好运!

标签: ios uiscrollview xib


【解决方案1】:

您应该实现awakeFromNib: 来初始化视图。如果不是,那么它可能没有正确设置。

NSNibAwaking 协议参考:此非正式协议由 单一方法,awakeFromNib。类可以实现这个方法来 对象加载后初始化状态信息 Interface Builder 存档(nib 文件)。

所以,我认为您的 impl 需要类似以下内容:

- (void)awakeFromNib {
    [[self scrollView] setContentSize:[[self contentView] frame].size];
    [[self scrollView] addSubview:[self contentView]];
    [[self contentView] layoutIfNeeded];
    return;
}

awakeFromNib 实际上是特殊的,因为它是 NSNibAwaking informal 协议的一部分(基本上意味着您的对象不必遵守它)。当从 nib 文件 (.xib) 加载对象时会发生这种情况,只要它实现了 awakeFromNib 方法,就会在所有出口连接后发送此消息。

【讨论】:

  • 既然我在prepareForSegue: sender: 中创建视图,我怎么知道首先调用哪个函数,viewDidLoad: - 确保 ScrollView 在那里 - 和 awakeFromNib: - 确保 Nib 是正确加载了吗?
  • 查看this answer 的问题。 ;) 本质上是首先调用 viewDidLoad。
  • 不幸的是,根据我的测试,这不是真的 - 我猜这是因为调用方法来指示不同视图的状态 - 解压 Storyboard xib 时调用 viewDidLoad 并调用 awakeFromNib容器视图已准备就绪...
  • 我只是尝试在主视图控制器的viewDidLoad 中初始化子视图,以确保调用顺序。即使这样也没有太大变化。
【解决方案2】:

我已经能够解决问题 - 我必须像这样在 initWithCoder: 中设置自定义视图的自动调整掩码:

- (id) initWithCoder:(NSCoder *)aDecoder {
    if (self = [super initWithCoder:aDecoder]) {
        [self setAutoresizingMask:UIViewAutoresizingFlexibleHeight];
    }

    return self;
}

希望这对其他人有所帮助....

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-11-08
    • 1970-01-01
    • 1970-01-01
    • 2015-05-23
    • 1970-01-01
    • 2017-01-28
    相关资源
    最近更新 更多