Objective-C - получить все подпредставления содержимого окна основного окна. - PullRequest
0 голосов
/ 26 августа 2011

Я хочу собрать координаты x / y и w / h всех подпредставлений contentView главного окна. В IB у меня есть объект просмотра, vHUD. Со временем я буду добавлять других в IB или программно. Я буду иметь их для различных целей пользовательского интерфейса, скользящих в видимой области. Поэтому мысль заключается в том, что я мог бы написать один метод переключения, собрать все данные координат в awakeFromNib, установить некоторые правила и затем, например, нажать кнопку, передать представление методу a, найти его свойства в словаре, (x , y, h, w, переключить правила), а затем выполнить правило.

Итак, в пробуждении от Nib у меня есть:

- (void) awakeFromNib { 

     [self getViewData: [mainWin contentView]];
     NSLog(@"%@", subviews);
}

и в getViewData:

- (void ) getViewData : (NSView* ) v { 

     subviews = [[v subviews] mutableCopy];


}

Но, похоже, это не сработало, поскольку оно вернуло ноль в мой журнал. Есть идеи, как я могу это сделать?

Ответы [ 2 ]

1 голос
/ 26 августа 2011

Не уверены, что поняли ваш вопрос, вы получаете подпредставления в главном окне, выполнив:

[[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 ...) и соответственно добавить их свойства, например, на 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
1 голос
/ 26 августа 2011

UIView не соответствует протоколу NSMutableCopying, даже NSCopying на самом деле.Поэтому любая попытка вызвать copy или mutableCopy не удастся.

В вашем случае я бы просто не взял копию или даже попытался бы.Работай с тем, что есть.Делайте это быстро и в главном потоке, и вы можете быть уверены, что иерархия стабильна для ваших расчетов.

...