【问题标题】:frame of different objects in IBOutletCollection returns emptyIBOutletCollection 中不同对象的框架返回空
【发布时间】:2013-08-05 19:38:01
【问题描述】:

我在情节提要上创建了 8 个不同的对象(4 对 UIImageView 和 textview)并将它们中的每一个连接到一个 IBOutletCollection,但是当我这样做时

for (UIView *element in infoElements) {
    NSLog(@"frame: %@", NSStringFromCGRect(element.frame));
}

返回

frame: {{0, 0}, {0, 0}}

[infoElements count] 正确返回 8

NSLog(@"element: %@", element);

正确返回对象,只有框架丢失。我只需要 IBOutletCollection 中每个对象的位置(x 和 y)。

初始化是这样的:

@interface infoViewController : UIViewController{
    IBOutletCollection(UIView) NSArray *infoElements;
}

@property (nonatomic, retain) IBOutletCollection(UIView) NSArray *infoElements;

我用谷歌搜索了好几个小时,没有发现任何人有同样的问题(this unanswered question here 除外),所以我认为我只是做错了什么

编辑

澄清一下,IBOutletCollection 中的对象不在位置 0,0 并且大于 0,0

【问题讨论】:

  • 你在哪里运行这段代码?在-init-viewDidLoad 或其他地方?您可以在注销元素本身时发布实际输出吗?
  • -viewDidLoad,第一个元素的输出为: element: >
  • 那是你的问题。改为在 -viewWillAppear 中执行。
  • -viewWillAppear 中的结果相同
  • 澄清一下,为什么你有两次声明 infoElements 并且你将 uiviews 连接到属性 IBOutletCollection?

标签: ios objective-c cocoa-touch iboutletcollection


【解决方案1】:

我猜你正在使用自动布局。在这种情况下,在调用 layoutSubviews 之前不会设置框架。

因此,如果您需要获取框架,可以在 - (void)viewDidLayoutSubviews 中进行。但是,如果您计划操作框架,则应在使用自动布局时使用约束来执行此操作。

另一种选择是在情节提要中关闭自动布局。

【讨论】:

  • 最后,谢谢各位,调用那个方法可以正常工作,问题是自动布局。顺便说一句,我能够使用以下方法操作对象: element.layer.position = CGPointMake(200, y);使用 QuartzCore 框架
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-09-27
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多