Проблема с autoresizingMask и фиксированными полями

Я пытаюсь заставить это работать с кодом в представлении ViewController:

альтернативный текст

но я не могу заставить его работать.

я пробовал

-(void)loadView {
    UIView *contentView = [[[UIView alloc] init] autorelease];
    self.view = contentView;
    UIButton *button = [UIButton buttonWithType:UIButtonTypeCustom];
    button.frame = CGRectMake(5,5,0,100);
    button.autoresizingMask = UIViewAutoresizingFlexibleWidth;
    [contentView addSubview:button];
}

но ширина кнопки по-прежнему равна ширине супервизора...

Я уверен, что есть простое объяснение.

Спасибо всем!

Антонио


person Antonio    schedule 12.11.2010    source источник


Ответы (3)


-initWithFrame: — это назначенный инициализатор для UIView. На стороне Mac (NSView) я знаю, что могут происходить странные вещи при использовании -init вместо -initWithFrame:. Возможно, это проблема?

person Joshua Nozzi    schedule 15.11.2010
comment
К сожалению, результат приведенного выше кода будет таким же, если я -initWithFrame:. Я не могу заставить кнопку увеличиваться, но оставляю поля по 5 пикселей по бокам... - person Antonio; 15.11.2010
comment
Вы инициализируете его с шириной кадра 110? Кроме того, вы помещаете свое представление в представление содержимого (которое само по себе может испортить его размер) перед добавлением к нему кнопки соответствующего размера. Я не уверен, что это то, что происходит на самом деле, но, вероятно, лучше построить иерархию вашего представления с известной геометрией, прежде чем добавлять ее к другой, что может изменить ее, вызывая автоматическое изменение размера до того, как ваша кнопка будет добавлена. Я надеюсь, что в этом есть смысл. - person Joshua Nozzi; 15.11.2010
comment
Вы совершенно правы. Пришлось начинать с фрейма. Спасибо за вашу помощь! - person Antonio; 15.11.2010
comment
o_O Вы передали нулевой прямоугольник, когда пробовали -initWithFrame: в первый раз? (смущенный) - person Joshua Nozzi; 15.11.2010

Вместо того, чтобы возиться с флагом autoresizingMask, я переопределяю layoutSubviews в пользовательском подклассе UIView:

- (void)loadView {
    self.view = [ContentView view];
    self.view.frame = CGRectMake(0, 0, 30, 100);
}

где ContentView определяется как:


@interface ContentView : UIView {
    UIButton *button;
}

+ (id)view;

@end

@implementation ContentView {

+ (id)view {
    return [[self new] autorelease];
}

- (id)initWithFrame:(CGRect)frame {
    if (self = [super initWithFrame:frame]) {
        button = [UIButton buttonWithType:UIButtonTypeCustom];
        [self addSubview:button]; // Retains the button.
    }
    return self;
}

- (void)layoutSubviews {
    const CGFloat margin = 5;

    CGRect size = self.frame.size;
    button.frame = CGRectMake(margin, margin,
        size.width - 2 * margin,
        size.height - 2 * margin);
}

}

person wl.    schedule 09.12.2010

Попробуйте этот код.

- (void)loadView
{
    CGRect screenBounds = [UIScreen mainScreen].bounds;
    UIView *contentView = [[[UIView alloc] initWithFrame:screenBounds] autorelease];
    self.view = contentView;
    UIButton *button = [UIButton buttonWithType:UIButtonTypeRoundedRect];
    button.frame = CGRectMake(5,5,screenBounds.size.width - 10,100);
    [button setTitle:@"hello" forState:UIControlStateNormal];
    button.autoresizingMask = UIViewAutoresizingFlexibleWidth;
    [contentView addSubview:button];
}
person hiroshi    schedule 14.07.2011