簡體   English   中英

Objective-C - 獲取主窗口contentView的所有子視圖

[英]Objective-C - get all subviews of main window's contentView

我想收集主窗口的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到我的日志。 知道如何做到這一點?

UIView不符合NSMutableCopying協議,實際上甚至不是NSCopying 因此,任何調用copymutableCopy嘗試都將失敗。

在你的情況下,我不會復制,甚至嘗試。 與什么是一起工作。 快速完成並在主線程上執行,您可以確保層次結構對於計算是穩定的。

通過執行以下操作,您無法理解您的主要窗口子視圖的問題:

[[mainWin contentView] subviews]

現在,如果你想復制這些子視圖,它有點棘手,因為正如PeyloW正確地提到的那樣, UIView沒有響應NSMutableCopying協議。

所以你可以編寫一個UIView類,並添加一個名為- (UIView*) forceCopy ,它將遞歸地創建新的- (UIView*) forceCopy並遞歸地- (UIView*) forceCopy給它的子- (UIView*) forceCopy

@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 ...)並相應地添加它們的屬性,例如在UILabel

@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

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM