Представление контейнера закрывает мое представление изображения

У меня есть containerView, который по умолчанию должен быть скрыт imageView, при запуске изображение должно закрывать контейнер. однако, несмотря на то, что слои в IB правильные и imageView обновляется после контейнера, контейнер все еще отображается перед изображением. Есть ли способ предотвратить это?

Вот схема ИБ:

введите здесь описание изображения

Когда я впервые опубликовал это, у меня был просмотр изображений и три кнопки в представлении в основном представлении. но с тех пор я изменил его на то, как он показан.

Учитывая, что у меня есть выходы для каждого подпредставления следующим образом: контейнер View-Container, Image View-backgroundImage, Buttons-item1, item2, item3.

Вот список вещей, которые я пробовал:

  1. [self.view sendSubviewToBack: _Container];
  2. [self.view bringSubviewToFront: _item1];
  3. [self.view bringSubviewToFront: _item2];
  4. [self.view bringSubviewToFront: _item3];
  5. [self.view bringSubviewToFront: _backgroundImage];

Я также пытался переместить представление контейнера из видимых координат контроллера представления, но это тоже не сработало.

Также вот мой метод viewDidAppear для контроллера представления:

Сначала я настраиваю представление контейнера, а затем делаю начальную настройку для кнопок и изображения. В нижней части этого метода я помещал команды subview. Надеюсь, это поможет.

-(void) viewDidAppear:(BOOL)animated {

[super viewDidAppear:animated];
[self.containerViewController performSegueWithIdentifier:@"embedConverter" sender:nil];

_item1.center = self.view.center;
_item2.center = self.view.center;
_item3.center = self.view.center;
_item1.layer.anchorPoint = CGPointMake(.5,1.5);
_item3.layer.anchorPoint = CGPointMake(.5,-.5);

CGAffineTransform move1 = CGAffineTransformMakeTranslation(0, -15);
CGAffineTransform move3 = CGAffineTransformMakeTranslation(0, 15);

_item1.transform = move1;
_item3.transform = move3;

[_item1 setTranslatesAutoresizingMaskIntoConstraints:YES];
[_item2 setTranslatesAutoresizingMaskIntoConstraints:YES];
[_item3 setTranslatesAutoresizingMaskIntoConstraints:YES];

CGAffineTransform scale = CGAffineTransformMakeScale(1.25, 1.25);

_item1.transform = scale;
_item2.transform = scale;
_item3.transform = scale;

_item1.alpha = menuAlpha;
_item2.alpha = menuAlpha;
_item3.alpha = menuAlpha;

_menuBackground.image = [self applyBlurWithRadius:10
                                        tintColor:[UIColor colorWithWhite:.3 alpha:.7]
                            saturationDeltaFactor:1
                                        maskImage:nil];

}


person Community    schedule 31.05.2014    source источник
comment
Пожалуйста, предоставьте снимок экрана, чтобы доказать, что слои в IB верны.   -  person matt    schedule 01.06.2014


Ответы (1)


Несмотря на заголовок вашего вопроса, проблемное представление — это не представление контейнера. Он остается там, где вы его положили. Проблемное представление — это другое представление, дополнительное содержащее представление, которое не отображается на снимке экрана раскадровки — из-за встроенного перехода или какой-либо другой формы родительско-дочернего представления. сдерживание контроллера задействовано.

Возможно, вы использовали встроенный переход, не понимая, что это такое. Я заметил, что у вас есть представление контейнера и контроллер представления контейнера и некоторые другие контроллеры представления. Возможно, вы сами запутались.

Одним из возможных исходных решений может быть удаление (закомментирование) этой строки:

[self.containerViewController performSegueWithIdentifier:@"embedConverter" sender:nil];
  • Это не нужно. У вас уже есть переход от представления контейнера к встраиванию, и это будет выполнено автоматически. Если представление контейнера не загружает автоматически правильный контроллер представления и его представление, вы неправильно настроили это в раскадровке (возможно, слишком много уровней сдерживания).

  • Это отношение контроллера представления родитель-потомок. Это означает, что появится дочерний контроллер представления, и его представление, которое является совершенно новым представлением, будет внедрено в ваш интерфейс. Это объясняет, почему вы не можете контролировать положение вида спереди назад! Вы можете сколько угодно возиться с "контейнерным представлением", но это не то представление, которое вы видите, которое вызывает проблемы - представление, которое вызывает проблемы, является новым посмотреть. Таким образом, вы выводите вид изображения на передний план, но затем этот новый вид внедряется перед всем.

Однако я бы пошел еще дальше. Используя переход для встраивания, вы полностью отказываетесь от контроля над порядком слоев внедренного представления. Я бы посоветовал вам задать себе два вопроса:

  1. Действительно ли мне вообще нужны отношения между родителем и дочерним контроллером представления? Во многих случаях ответ отрицательный. Например, предположим, что вы хотите, чтобы внутри вашего интерфейса было небольшое табличное представление. Некоторые люди думают, что для этого требуется контроллер табличного представления и встроенный переход. Но это не так; контроллер табличного представления никогда не требуется, и вы можете управлять таблицей так, как представление идеально подходит для вашего

  2. Если ответ на (1) действительно да, то не лучше ли мне управлять этой взаимосвязью — и результирующим внедренным представлением — вручную?

Если бы вы сделали (2), вам бы не понадобилось представление контейнера, и вы бы полностью контролировали, где и как введенное представление помещается в ваш интерфейс.

person matt    schedule 01.06.2014
comment
И вот мое обсуждение того, как вручную управлять отношениями между родительским и дочерним контроллером представления (и представлением): apeth.com/iOSBook/ch19.html#_container_view_controllers - person matt; 01.06.2014
comment
Но на самом деле подумайте о том, чтобы не использовать это. Возможно, вас устроит всего лишь один контроллер представления, а все остальное — просто представления, которыми он управляет. - person matt; 01.06.2014
comment
Большое спасибо за ссылку, она была очень полезной. У меня есть несколько вопросов. У меня будет некоторый контроллер основного представления с собственным представлением, тогда у этого представления будут некоторые подпредставления (кнопки и представление изображения), эти представления будут там постоянно, это будет действовать как меню. но тогда у меня будет несколько других возможных представлений, которые будут полноэкранными, мой вопрос в том, когда позже я добавлю эти дочерние представления, смогу ли я заставить их появляться в виде слоя в задней части моих представлений меню? - person ; 01.06.2014
comment
Это совершенно новый вопрос. Задайте совершенно новый вопрос! Я попытался ответить на вопрос, который вы задали здесь, а именно, почему этот вид появляется перед моим изображением. Думаю, я успешно объяснил это. - person matt; 01.06.2014
comment
Кроме того, я действительно новичок в этом, поэтому не могли бы вы объяснить, как я сохраняю ссылки на мои дочерние контроллеры представления? Я предполагаю, что это должно быть сделано в IB, потому что иначе у вас не будет доступа к ним во время работы программы, верно? в любом случае, где именно я могу сделать эту ссылку? - person ; 01.06.2014
comment
Пожалуйста, перестаньте писать об этом в комментариях. Просто потому, что кто-то пытается дать вам ответ, вы не должны запугивать его, чтобы он предоставил дополнительную информацию. Это называется вампиром-помощником. Тщательно сформулируйте новый вопрос, а затем задайте его отдельно как вопрос. - person matt; 01.06.2014