2016-02-02 2 views
1

у меня был простой контроллер представления под названием ViewController, он находится в навигации стека, структура, как следующая:Добавить дети смотреть контроллер в контроллер, который толкнул в контроллер навигации

UINavigationControlelr 
    UIViewController 
    ViewController 

ViewController имел детей view, который называется a, я добавляю a в ViewController, а рамка - в рамки ViewController. У меня есть два других UIViewController, называемые b и c, я добавляю b и c в a. Б рама рама

CGRect(x: 0, y: 0, width: 100, height: 100) 

C является

CGRect(x: 0, y: 100, width: 100, height: 100) 

Если я устанавливаю навигационной панели просвечивает правда, вид показывает правильно, как показано ниже: enter image description here

Но когда я установил навигацию бар полупрозрачный до ложного, произошло что-то странное. enter image description here

Что происходит. Как исправить эту проблему? Проект прост, вы можете скачать здесь, чтобы проверить эту проблему: download

+0

, если вы еще не пробовали, вид отладчик может быть в состоянии помочь. – ishaq

+0

ваша высота просмотров установлена ​​на 36, ровно на 64 пикселя меньше установленной вами высоты, я бы сказал, что она имеет какое-то отношение к вставкам. – ishaq

+0

yep, его называют слишком ранним, и к тому моменту, когда iOS настраивает рамку представления, чтобы избежать непрозрачной черной полосы (т. Е. Добавляет 64 пикселя в исходное изображение origin.y), ваши рамки просмотра ребенка уже установлены. ответили ниже. – ishaq

ответ

2

проблема причина, по умолчанию UIViewControllerview имеет FlexibleWidth & FlexibleHeight

bController и cController' ы view имеет дополнительный зазор 64 пикселей (NavBar (44) + Строка состояния (20)). Теперь, когда вы изменяете размер, у него есть «FlexibleWidth» & FlexibleHeight`, с которым можно играть.

Решение может быть сделать autoresizingMask к .None

override func viewDidLoad() { 
    super.viewDidLoad() 

    view.backgroundColor = UIColor.greenColor() 

    bController = b() 
    cController = c() 

    bController.view.autoresizingMask = .None 
    cController.view.autoresizingMask = .None 

    displayContentController(bController, toFrame: CGRect(x: 0, y: 0, width: 100, height: 100)) 
    displayContentController(cController, toFrame: CGRect(x: 0, y: 100, width: 100, height: 100)) 
} 
+0

Отлично, это решает мою проблему.Спасибо. – leizh00701

+0

Действительно, реальная проблема заключается в том, что 'viewDidLoad' не подходит для просмотра макета. Кроме того, мы должны действительно прекратить использование autoresizingMasks для макета ручек обуви сейчас, когда мы дошли до этого с автозапуском. – ishaq

2

Вы устанавливаете фреймы в viewDidLoad, обратите внимание, что макет вида не делается намного позже. viewWillLayoutSubviews и viewDidLayoutSubviews, вызывается до и после макета).

Переведите свой код установки рамки в viewDidLayoutSubviews, и он будет работать нормально.

ПРИМЕЧАНИЕ:: Вы также можете уйти с настройкой рамки вида в viewWillAppear, но это подходящее место для установки фреймов. viewWillAppear вызывается как раз перед тем, как появится представление, вид макета может измениться после появления представления (например, в ответ на вращение устройства).

+0

Спасибо, я установил рамки просмотров в viewDidLayoutSubviews, он работает. Но в viewWillAppear это не работает. Я устанавливаю рамки представления в viewDidAppear, он работает. – leizh00701

+0

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

Смежные вопросы