Objective-C - 获取主窗口内容视图的所有子视图

Posted

技术标签:

【中文标题】Objective-C - 获取主窗口内容视图的所有子视图【英文标题】:Objective-C - get all subviews of main window's contentView 【发布时间】:2011-08-26 19:08:01 【问题描述】:

我想收集主窗口 contentView 的所有子视图的 x/y 坐标和 w/h。在 IB 中,我有一个视图对象 vHUD。最终,我将在 IB 中或以编程方式添加其他人。我将让它们用于各种 UI 目的滑入和滑出可视区域。所以我的想法是我可以写一个切换方法,在 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。知道我该怎么做吗?

【问题讨论】:

【参考方案1】:

UIView 不符合NSMutableCopying 协议,实际上甚至不符合NSCopying。所以任何调用copymutableCopy 的尝试都会失败。

在你的情况下,我不会复制,甚至不会尝试。与什么一起工作。在主线程上快速执行,您可以确保层次结构对于您的计算是稳定的。

【讨论】:

【参考方案2】:

不确定是否理解您的问题,您可以通过以下方式获得主窗口子视图:

[[mainWin contentView] subviews]

现在,如果您想复制这些子视图,那就有点棘手了,因为正如 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 ...)创建尽可能多的类别,并相应地添加它们的属性,例如在@987654327 @

@implementation UILabel (YourCategory)

- (UIView*) forceCopy

    UILabel* aNewLabel = (UILabel*)[super forceCopy];
    if (aNewLabel)
    
        [aNewLabel setFont:[self font]];
        [aNewLabel setText:[self text]];
        [aNewLabel setTextAlignment:[self textAlignment]];
        [aNewLabel setTextColor:[self textColor]];
        [aNewLabel setLineBreakMode:[self lineBreakMode]];
        [aNewLabel setMinimumFontSize:[self minimumFontSize]];
        [aNewLabel setAdjustsFontSizeToFitWidth:[self adjustsFontSizeToFitWidth]];
    
    return aNewLabel;


@end

【讨论】:

以上是关于Objective-C - 获取主窗口内容视图的所有子视图的主要内容,如果未能解决你的问题,请参考以下文章

Cocoa/Objective-C - 带有文本输入的子窗口,而主窗口没有变为非活动状态

获取应用程序的主窗口

在加载主应用程序视图之前获取一些设备信息

目标-c:在按钮单击时将视图添加到窗口

约束单窗口MacOS Objective-C的纵横比

如何获取主应用程序窗口标题栏的高度?