【问题标题】:Objective-C - get all subviews of main window's contentViewObjective-C - 获取主窗口内容视图的所有子视图
【发布时间】: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。知道我该怎么做吗?

【问题讨论】:

    标签: objective-c views


    【解决方案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
      

      【讨论】:

        猜你喜欢
        • 2014-12-16
        • 1970-01-01
        • 2011-07-23
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多