Автоматическое изменение размера подвидов: изменение размера кажется абсолютным, а не пропорциональным.

У меня есть странная проблема, которая, вероятно, имеет очень простое решение, я просто не вижу его...

У меня есть класс UIView, который содержит кнопку в качестве подвида, охватывающую 4/5 ширины и одну треть высоты представления. Когда родительский вид изменяется (например, имеет высоту и половину ширины), кнопка должна оставаться там, где она находится (верхняя треть родительского вида), и теперь также имеет половину ширины и еще одну треть новой высоты.

Это означает:

Parent before: Frame (0,0,100,100)
Button before: Frame (0,0,80,33.3)

Parent after: Frame (0,0,50,50)
Button after: Frame (0,0,40,16.7)

Проблема в том, что кнопка после всегда имеет Frame (0,0,30,0). Кажется, что новую ширину и высоту кнопки я только что получил, вычитая 50-пиксельное изменение вместо пропорционального изменения размера. Должно быть что-то очень глупое, но я никак не могу найти.

Вот код моего класса UIView:

-(id)init
{
    self = [super init];
    if(self)
    {
        self.autoresizesSubviews = true;

        self.frame = CGRectMake(0,0,100,100);
        button = [UIButton buttonWithType:UIButtonTypeCustom];
        button.frame = CGRectMake(0,0,80, self.frame.size.height / 3);
        button.autoresizingMask = UIViewAutoresizingFlexibleHeight
                                  |UIViewAutoresizingFlexibleWidth;

        [self addSubview:button];
    }

    return self;
}

У кого-нибудь есть идея? Я уже испробовал несколько вариаций флагов autoresizeMask, но безрезультатно — и приведенные выше флаги тоже должны быть правильными...


person TheEye    schedule 17.02.2012    source источник


Ответы (1)


Вот что вам нужно сделать:

button.autoresizingMask = UIViewAutoresizingFlexibleHeight |
                          UIViewAutoresizingFlexibleWidth |
                          UIViewAutoresizingFlexibleRightMargin |
                          UIViewAutoresizingFlexibleBottomMargin;

Если вы устанавливаете гибкие высоту и ширину без установки гибких полей, то при изменении размера происходит то, что высота и ширина изменяются так, что поля (т. Е. Расстояние до границ суперпредставления) остаются постоянными.

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

person yuji    schedule 17.02.2012
comment
Я только что нашел это сам сейчас, повозившись с IB и сравнив настройки в коде ... это невероятно несовместимо между ними - в IB достаточно активно установить две внутренние красные линии и оставить внешние линии серыми, но в В самой autoresizingMask вам нужно добавить все флаги - для того, что я хочу сделать, даже для левого и верхнего поля ... но все равно спасибо :-) - person TheEye; 17.02.2012
comment
На самом деле это довольно последовательно: пружины внутри коробки эквивалентны UIViewAutoresizingFlexibleHeight и UIViewAutoresizingFlexibleWidth, а активация верхней структуры эквивалентна выключению UIViewAutoresizingFlexibleTopMargin off (и так далее для трех других полей). - person yuji; 17.02.2012
comment
последовательно, если вы это знаете :-) - person TheEye; 17.02.2012