[英]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
。 因此,任何調用copy
或mutableCopy
嘗試都將失敗。
在你的情況下,我不會復制,甚至嘗試。 與什么是一起工作。 快速完成並在主線程上執行,您可以確保層次結構對於計算是穩定的。
通過執行以下操作,您無法理解您的主要窗口子視圖的問題:
[[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.