Контейнер подпредставления UIScrollView неправильно меняет кадры

У меня проблема с представлениями ChildViewController, когда их фреймы автоматически меняются на фреймы их родителей. Я перегнал его в пример проекта с одним классом, чтобы проиллюстрировать, что происходит.

Вкратце, я:

  • иметь ScrollViewController
  • добавьте ScrollViewController в качестве RootViewController и добавьте в окно
  • В ScrollViewController — в ViewDidLoad я создаю Container UIView с фреймом {{0, 0}, {72704, 768}}
  • Создайте UIScrollView с фреймом {{0, 0}, {1024, 768}}.
  • Добавьте ScrollView в представление ScrollViewController.
  • Добавьте контейнер в ScrollView
  • Создайте 71 UIViewController с фреймом {{0, 0}, {1024, 768}}.
  • Добавьте их как ChildViewControllers ScrollViewController.
  • Добавьте свои подвиды в контейнер
  • Зарегистрировать все 71 кадр в ViewDidAppear.
  • Каждый кадр {{0, 0}, {72704, 768}} - НЕ 1024 x 768, который я установил.

Для всех автоматически изменяющихся масок / автоматически изменяющихся размеров подпредставлений установлено значение НЕТ.

Это работает на iOS 6, но также происходит и на iOS 5.1!

ОБНОВЛЕНИЕ! Похоже, что виноват addChildViewController. Не уверен, почему - это ожидаемое поведение? Мне нужно иметь возможность добавлять эти childViewControllers в ScrollViewController без автоматического масштабирования их фреймов представлений до их родителей. Разве это не способ сделать это теоретически?

Также - нигде нет СИБов. Установите для параметра «translatesAutoresizingMaskIntoConstraints» значение NO в Scrollview/ContainerView и каждом из 71 представления VC. То же самое, к сожалению. Это кажется очень странным поведением...

Ссылка на проект - https://dl.dropbox.com/u/637000/TestingBug.zip

КОД ИЗ ScrollViewController:

    - (void)viewDidLoad
    {
        [super viewDidLoad];

        [self initScrollView];
        [self createTestViews];
    }

    - (void)initScrollView {
        if(scrollView == nil) {
            containerView = [[UIView alloc] initWithFrame:CGRectMake(0, 0, 72704, 768)];
            containerView.autoresizingMask = UIViewAutoresizingNone;
            containerView.autoresizesSubviews = NO;

            scrollView = [[UIScrollView alloc] initWithFrame:CGRectMake(0, 0, 1024, 768)];
            scrollView.autoresizingMask = UIViewAutoresizingNone;
            scrollView.showsHorizontalScrollIndicator = NO;
            scrollView.showsVerticalScrollIndicator = NO;
            scrollView.autoresizesSubviews = NO;
            scrollView.delegate = self;

            [self.view addSubview:scrollView];
            [scrollView addSubview:containerView];
        }
    }

    - (void)createTestViews {
        for(int count = 0; count < 71; count++) {
            [self createTestView];
        }
    }

    - (void)createTestView {
        UIViewController *testVC = [[UIViewController alloc] init];
        testVC.view.frame = CGRectMake(0, 0, 1024, 768);

        [self addChildViewController:testVC];
        [containerView addSubview:testVC.view];
        [testVC didMoveToParentViewController:self];
    }

    - (void)viewDidAppear:(BOOL)animated {
        [super viewDidAppear:animated];

        for(UIView *subview in containerView.subviews) {
            // THIS IS {{0, 0}, {72704, 768}} NOT 1024 x 768
            NSLog(@"BROKEN FRAME = %@", NSStringFromCGRect(subview.frame));
        }
    }

person Praveen Sharma    schedule 24.12.2012    source источник


Ответы (2)


В IOS 7.0 используйте self.automaticallyAdjustsScrollViewInsets=NO; в ViewDidLoad

person Baljeet Singh    schedule 25.03.2014

Создайте 71 UIViewController с фреймом {{0, 0}, {1024, 768}}.

Вау! Это звучит как совершенно ненужное использование UIViewController. Можно ли обойтись без него? Обычным делом является добавление представлений непосредственно в представление прокрутки без какого-либо промежуточного включения UIViewController foo.

Чтобы более точно ответить на ваш вопрос: может ли быть задействован автомакет? (По умолчанию ответ да для любого нового пера, созданного в Xcode 4.5.) Я не вижу, чтобы вы устанавливали translatesAutoresizingMaskIntoConstraints в NO, поэтому, если autolayout играет роль, возможно, он изменяет размер представлений. Конечно, я также не вижу, чтобы вы устанавливали какие-либо autoresizingMask для начала, поэтому вы получаете значение по умолчанию, за которое вы не отвечаете.

person matt    schedule 24.12.2012
comment
Что ж, источник этой проблемы лежит в сложной структуре, которую я построил, которая может поддерживать динамическое создание приложений. Рассматриваемый 71 VC является теоретическим VC-контейнером, который может загружать и выгружать свои представления при необходимости. Они могут быть любой структуры. Все генерируется в коде - никаких NIB, но теперь я дважды проверю общий автоматически сгенерированный nib. Я также попробую перевести AutoResizingMask прямо сейчас! Спасибо. - person Praveen Sharma; 25.12.2012
comment
Никаких НИБ нигде. Установите для translatesAutoresizingMaskIntoConstraints значение NO для Scrollview/ContainerView и каждого из 71 представления VC. То же самое, к сожалению. Это кажется очень странным поведением. - person Praveen Sharma; 25.12.2012
comment
у меня та же проблема, я пробовал "translatesAutoresizingMaskIntoConstraints", но не работает, пожалуйста, помогите - person Sanoj; 27.07.2013