Динамическое изменение кадров подвидов в приложении iOS

У меня есть представление, кадры подвидов которого мне нужно динамически изменять в ответ на действия пользователя. Когда представление загружается, я инициализирую его подпредставления следующим образом:

if (self.firstSubview == nil) {
    NSArray* views = [[NSBundle mainBundle] loadNibNamed:@"FirstSubView" owner:self options:nil];
    for (UIView *view in views) {
        self.firstSubview = view;
    }
}

а потом:

[self.view addSubview:self.firstSubview];

После инициализации, когда я хочу изменить кадр подвида, я делаю что-то вроде этого:

self.firstSubview.frame = CGRectMake(0, 80, self.firstSubview.frame.size.width, 200);

Что я хочу сделать, так это настроить координату Y подвида и его высоту, когда пользователь нажимает кнопку, и вернуть исходный кадр подвида, когда пользователь снова нажмет кнопку. Однако я обнаружил, что иногда это не работает, координата Y и высота, кажется, не всегда устанавливаются, как я говорю в функции CGRectMake. Похоже, что функция не всегда принимает абсолютные значения, а вместо этого зависит от значений последнего кадра... Я имею в виду, похоже, что не всегда кадр принимает координату Y = 80 после вызова этой функции.

Возможно, я неправильно понимаю, как это работает: в файле представления nib я установил верхнюю и нижнюю полосы в его Simulated Metrics, поэтому высота представления должна быть оставшимся пространством между этими полосами, а координата (0,0) должна быть верхний левый угол под верхней панелью, верно? Есть что-то, что мне не хватает? Должен ли я повторно инициализировать и снова добавлять подвид каждый раз, когда я хочу изменить его кадр? Или есть что-то еще, что я должен сделать, чтобы применить изменения кадра?

заранее спасибо


person AppsDev    schedule 20.05.2014    source источник
comment
Нет, вы не должны каждый раз повторно инициализировать свое подвид? Используете ли вы файл пера для вашего подпредставления? Содержит ли он также смоделированные показатели?   -  person streem    schedule 20.05.2014
comment
Да, у меня есть мое подпредставление в другом файле nib, в котором не установлены смоделированные показатели...   -  person AppsDev    schedule 20.05.2014


Ответы (1)


Цикл for-in, который вы разместили, установит каждый элемент из представлений массива по порядку в свойство self.firstSubview, так что после цикла self.firstSubview будет иметь последний элемент. Если это действительно то, что вы хотите, то вот более простой способ:

if (views.count > 0)
    self.firstSubview = views.lastObject;

Или, возможно:

for (id element in views)
{
    if ([element isKindOfClass:[UIView class]])
    {
        self.firstSubview = element;
        break;
    }
}
person Sterling Christensen    schedule 04.12.2014