我想收集主窗口contentView的所有子视图的x / y坐标和w / h。在IB中我有一个视图对象vHUD。最终我将在IB中或以编程方式添加其他内容。我会将它们用于各种UI用途,可以滑入和滑出可视区域。所以我的想法是我可以编写一个toggle方法,收集awakeFromNib中的所有坐标数据,设置一些规则然后打开,例如,按钮点击,将视图传递给a方法,在字典中找到它的属性,(x ,y,h,w,切换规则)然后执行规则。
所以在awakeFromNib中我有:
- (void) awakeFromNib {
[self getViewData: [mainWin contentView]];
NSLog(@"%@", subviews);
}
并在getViewData中:
- (void ) getViewData : (NSView* ) v {
subviews = [[v subviews] mutableCopy];
}
但是这似乎没有用,因为它返回null到我的日志。知道如何做到这一点?
答案 0 :(得分:1)
UIView
不符合NSMutableCopying
协议,实际上甚至不符合NSCopying
。因此,任何致电copy
或mutableCopy
的尝试都将失败。
在你的情况下,我不会复制,甚至尝试。与什么是一起工作。快速完成并在主线程上执行,您可以确保层次结构对于计算是稳定的。
答案 1 :(得分:1)
通过执行以下操作,确定无法理解您的主要窗口子视图的问题:
[[mainWin contentView] subviews]
现在,如果你想 COPY 这些子视图有点棘手,因为PeyloW正确地提到,UIView
没有响应NSMutableCopying
协议。
因此,您可以编写一个UIView
类别,并添加一个名为- (UIView*) forceCopy
的方法,该方法将递归地创建新的UIViews并递归地传递其子项:
@implementation UIView (YourCategory)
- (UIView*) forceCopy
{
if (self == nil)
return nil;
UIView* aNewView = [[[self class] alloc] initWithFrame:self.frame];
[aNewView setBackgroundColor:[self backgroundColor]];
[aNewView setCenter:[self center]];
[aNewView setContentMode:[self contentMode]];
[aNewView setHidden:[self isHidden]];
[aNewView setAlpha:[self alpha]];
[aNewView setOpaque:[self isOpaque]];
[aNewView setTag:[self tag]];
for (UIView* aChildenView in [self subviews])
{
UIView* aPotentialNewView = [aChildenView forceCopy];
if (aPotentialNewView)
[aNewView addSubview:aPotentialNewView];
}
return aNewView;
}
@end
但是要小心你需要创建尽可能多的类别,因为主窗口中有不同类型的视图(UIButton,UILabel ...),并相应地添加它们的属性,例如在{{ 1}}
UILabel