Как использовать авторесайз программно IOS?

Я сделал код без раскадровки для Iphone 5 (8.1) с некоторыми подвидами. Это работает для устройства Iphone 5, но не для других… Я пытался вставить функцию автоматического изменения размера, но не знаю, почему она до сих пор не работает.

Вот мой код:

#import "MenuViewController.h"
#import "RevealViewController.h"

@interface MenuViewController ()
@property UIView *blurMask;
@property UIImageView *blurredBgImage;
@end

@implementation MenuViewController
@synthesize blurMask, blurredBgImage;

- (id)initWithNibName:(NSString *)nibNameOrNil bundle:(NSBundle*)nibBundleOrNil{
    self = [super initWithNibName:nibNameOrNil bundle:nibBundleOrNil];
    if (self) {
        // Custom initialization
    }
    return self;
}

- (void)viewDidLoad{

    _barButton.target = self.revealViewController;
    _barButton.action = @selector(revealToggle:);

    [self.view addGestureRecognizer:self.revealViewController.panGestureRecognizer];
    [super viewDidLoad];
    [self Blur:blurredBgImage];
}

- (void)loadView{
    [super loadView];
    self.view = [[UIView alloc] initWithFrame:[[UIScreen mainScreen] bounds]];
    self.view.backgroundColor = [UIColor whiteColor];
    [[self view] setAutoresizingMask:(UIViewAutoresizingFlexibleWidth | UIViewAutoresizingFlexibleHeight)];
    [[self view] setAutoresizesSubviews:YES];

    // content view
    [self.view addSubview:[self createContentView]];

    // slide view
    [self.view addSubview:[self createScrollView]];

    blurMask = [[UIView alloc] initWithFrame:CGRectMake(0, self.view.frame.size.height - 50, self.view.frame.size.width, 50)];
    blurMask.backgroundColor = [UIColor whiteColor];
    blurredBgImage.layer.mask = blurMask.layer;

}

-(void)scrollViewDidScroll:(UIScrollView *)scrollView{
    blurMask.frame = CGRectMake(blurMask.frame.origin.x,
                            self.view.frame.size.height - 0 - scrollView.contentOffset.y,
                            blurMask.frame.size.width,
                            blurMask.frame.size.height + scrollView.contentOffset.y);
}

- (UIView *)createContentView
{
    UIView *contentView = [[UIView alloc] initWithFrame:self.view.frame];
    [contentView setAutoresizingMask:(UIViewAutoresizingFlexibleWidth | UIViewAutoresizingFlexibleHeight)];
    [contentView setAutoresizesSubviews:YES];

    UIImageView *contentImage = [[UIImageView alloc] initWithFrame:contentView.frame];
    contentImage.image = [UIImage imageNamed:@"back-ground.png"];
    [contentView addSubview:contentImage];
    return contentView;
}

- (UIView *)createScrollView{
    UIView *containerView = [[UIView alloc] initWithFrame:self.view.frame];
    [containerView setAutoresizingMask:(UIViewAutoresizingFlexibleWidth | UIViewAutoresizingFlexibleHeight)];
    [containerView setAutoresizesSubviews:YES];

    blurredBgImage = [[UIImageView  alloc] initWithFrame:CGRectMake(0, -57, self.view.frame.size.width, 568)];
    [blurredBgImage setContentMode:UIViewContentModeScaleToFill];
    [containerView addSubview:blurredBgImage];

    UIScrollView *scrollView = [[UIScrollView alloc] initWithFrame:self.view.frame];
    [containerView addSubview:scrollView];
    scrollView.contentSize = CGSizeMake(self.view.frame.size.width,  self.view.frame.size.height*2 - 110);
    scrollView.pagingEnabled = YES;
    scrollView.delegate = self;
    scrollView.bounces = NO;
    scrollView.showsHorizontalScrollIndicator = NO;
    scrollView.showsVerticalScrollIndicator = NO;

    UIView *slideContentView = [[UIView alloc] initWithFrame:CGRectMake(0, 455, self.view.frame.size.width, 508)];

    slideContentView.backgroundColor = [UIColor clearColor];
    [scrollView addSubview:slideContentView];

    UILabel *slideUpLabel = [[UILabel alloc] initWithFrame:CGRectMake(0, 6, self.view.frame.size.width, 50)];
    slideUpLabel.text = @"Informations";
    [slideUpLabel setFont:[UIFont fontWithName:@"HelveticaNeue-Light" size:18]];
    [slideUpLabel setTextAlignment:NSTextAlignmentCenter];
    [slideUpLabel setContentMode:UIViewContentModeScaleToFill];
    slideUpLabel.textColor = [UIColor colorWithWhite:1 alpha:0.5];
    [slideContentView addSubview:slideUpLabel];

    UIImageView *slideUpImage = [[UIImageView alloc] initWithFrame:CGRectMake(self.view.frame.size.width/2 - 12, 4, 24, 22.5)];
    slideUpImage.image = [UIImage imageNamed:@"up-arrow.png"];
    [slideContentView addSubview:slideUpImage];

    UITextView *detailsText = [[UITextView alloc] initWithFrame:CGRectMake(20, 60, 275, 350)];
    detailsText.backgroundColor = [UIColor clearColor];
    detailsText.text = @"Details text… with information ";
    [detailsText setFont:[UIFont fontWithName:@"HelveticaNeue-Light" size:16]];
    [detailsText setTextAlignment:NSTextAlignmentCenter];
    detailsText.textColor = [UIColor colorWithWhite:1 alpha:0.6];

    [slideContentView addSubview:detailsText];

    UIImageView *Facebook = [[UIImageView alloc] initWithFrame:CGRectMake(105, 260, 42, 42)];
    Facebook.image = [UIImage imageNamed:@"facebook.png"];

    [slideContentView addSubview:Facebook];

    UIImageView *Twitter = [[UIImageView alloc] initWithFrame:CGRectMake(168, 260, 42, 42)];
    Twitter.image = [UIImage imageNamed:@"twitter.png"];

    [slideContentView addSubview:Twitter];

    UITextView *rsText = [[UITextView alloc] initWithFrame:CGRectMake(20, 300, 275, 350)];
    rsText.backgroundColor = [UIColor clearColor];
    rsText.text = @"Text Facebook text Twitter. mail ";
    [rsText setFont:[UIFont fontWithName:@"HelveticaNeue-Light" size:16]];
    [rsText setTextAlignment:NSTextAlignmentCenter];
    rsText.textColor = [UIColor colorWithWhite:1 alpha:0.6];

    [slideContentView addSubview:rsText];

    UITextView *endText = [[UITextView alloc] initWithFrame:CGRectMake(25, 450, 270, 350)];
    endText.backgroundColor = [UIColor clearColor];
    endText.text = @"Thank you ";
    [endText setFont:[UIFont fontWithName:@"HelveticaNeue-Light" size:12]];
    [endText setTextAlignment:NSTextAlignmentCenter];
    endText.textColor = [UIColor colorWithWhite:1 alpha:0.6];

    [slideContentView addSubview:endText];

    return containerView;
}

- (void)didReceiveMemoryWarning {
    [super didReceiveMemoryWarning];
    // Dispose of any resources that can be recreated.
}
- (void)Blur:(UIView *)view {
    UIView *blurView=nil;
    if ([UIBlurEffect class]) {
        UIBlurEffect *blurEffect= [UIBlurEffect effectWithStyle:UIBlurEffectStyleDark];
        blurView = [[UIVisualEffectView alloc] initWithEffect:blurEffect];
        blurView.frame = view.frame;
    }else {
        blurView = [[UIToolbar alloc] initWithFrame:view.bounds];

    }
    [blurView setTranslatesAutoresizingMaskIntoConstraints:NO];
    [view addSubview:blurView];
    [view addConstraints:[NSLayoutConstraint constraintsWithVisualFormat:@"H:|[blurView]|" options:0 metrics:0 views:NSDictionaryOfVariableBindings(blurView)]];
    [view addConstraints:[NSLayoutConstraint constraintsWithVisualFormat:@"V:|[blurView]|" options:0 metrics:0 views:NSDictionaryOfVariableBindings(blurView)]];

}

@end

Любая идея? Обратная связь? Спасибо.


person pierto    schedule 22.02.2015    source источник
comment
Что не работает?   -  person Yuchen    schedule 22.02.2015
comment
Обычно я создаю такие представления в раскадровке и добавляю ограничения с включенным автоматическим макетом. Если мне нужно создать что-то универсальное в коде, я занимаюсь математикой и размещаю вещи там, где они должны быть. Это все методом проб и ошибок. Я действительно не понял программных ограничений/автоматического изменения размера   -  person kygcoleman    schedule 22.02.2015


Ответы (2)


Под обратную связь больше подпадает следующее:

  1. Похоже, ваш код был скопирован/вставлен, но ваши вызовы @property не указывают атомарность или то, как ARC должен их обрабатывать, поэтому, возможно, это было несколько перефразировано.
  2. Если вы собираетесь программно создать контроллер представления, он не вызывает initWithNib:
  3. Чтобы назначить цель/действие кнопке, вы будете использовать addTarget:action:forControlEvents:
  4. @synthesize не нужен, если только вы не собираетесь писать собственный сеттер
  5. методы в Objc всегда начинаются со строчной буквы ( [MenuViewController Blur] )
  6. From the loadView documentation:

    Your custom implementation of this method should not call super.

  7. Если вы явно устанавливаете свойство view контроллера представления, чтобы иметь фрейм [UIScreen mainScreen].bounds, вам не нужно устанавливать его автоматическое изменение размера — оно уже будет соответствовать размеру экрана. Это касается всех ваших представлений, для которых вы это делаете.
  8. Не уверен, что причина вычитания 0 здесь: self.view.frame.size.height - 0 - scrollView.contentOffset.y
  9. В вашем методе createScrollView происходит довольно много... за ним трудно следить, не имея комментариев в вашем коде или какого-либо изображения, показывающего, где находится каждое из этих подпредставлений. Настраиваемая иерархия представлений кажется слишком сложной, и ее лучше всего реализовать в пользовательском подклассе UIView или UIScrollView. Я бы подумал об этом так: могли бы вы легко сказать, как выглядело бы это представление, если бы вы не смотрели на этот код в течение месяца?
  10. Это, вероятно, работает только с 5, поскольку вы устанавливаете элементы UIKit в определенные места в кадре, а не используете маски автомакета или автоматического изменения размера (хотя используйте автомакет, это будущее, и Apple имеет тенденцию прекращать поддержку старых технологий)

person Louis Tur    schedule 22.02.2015

Я не уверен, какие части вашего кода могут быть преднамеренными без дополнительного контекста. Однако похоже, что вы добавляете маску автоматического изменения размера в contentView и scrollView, но не в какие-либо из этих двух подпредставлений. Например, в вашем методе createContentView, если вы хотите, чтобы размер UIImageView изменялся при изменении размера contentView, вам также необходимо добавить ограничения автоматического изменения размера в UIImageView. то есть imageView.autoresizingMask = UIViewAutoresizingFlexibleWidth|UIViewAutoresizingFlexibleHeight

То же самое со всеми подвидами вашего slideContentView.

person Matthew Smith    schedule 22.02.2015