2015-09-08 2 views
0

Прежде всего я удивлен, что не мог найти этот вопрос здесь и в Google. Кажется, что-то другим может понадобиться эта функциональность. Так что, если это все-таки дубликат, извините, я искал высоко и низко.Изображение в качестве фона для каждого окна

У меня есть приложение со следующей структурой в моем раскадровки:

-> Root Tab Bar контроллер -> (для каждой из вкладок) SplitView Controller -> Навигационный контроллер -> TableView Controller -> Detail View Controller

Я хочу установить фоновое изображение, которое будет одинаковым во всем приложении. Моя идея состояла в том, чтобы установить это изображение в моем App Делегат для контроллера Tab Root в:

func application(application: UIApplication, didFinishLaunchingWithOptions launchOptions: [NSObject: AnyObject]?) -> Bool 

метод. :

var imageView = UIImageView(frame: self.window!.frame) 
    var image = UIImage(named: "bg.png")! 
    imageView.image = image 

    self.window!.rootViewController!.view.backgroundColor = UIColor.clearColor() 
    self.window!.rootViewController!.view.addSubview(imageView) 
    self.window!.rootViewController!.view.sendSubviewToBack(imageView) 

Прежде всего, это хорошее место для его установки?

Проблемы у меня сейчас, если у меня есть, что последняя строка кода:

self.window!.rootViewController!.view.sendSubviewToBack(imageView) 

Я не вижу изображение. (для моих UITableView и UITableViewCells я установил opaque для false и BackGroundColor для ClearColor)

Если я удалю эту последнюю строку, изображение будет там, но поверх всего, и я не вижу никакого содержимого (нет вкладок, нет сплит-вид ...)

Пожалуйста, помогите мне исправить это или показать лучший способ. ТИА

+0

Проблема заключается в том, вы не знаете, что другие виды добавляются в иерархию на вкладке, расщепленных и навигационных контроллеров. вам, вероятно, придется подойти к уровню контроллера навигации – Wain

+0

, это означало бы 2 вещи: мне нужно было бы реализовать это для каждого контроллера навигации (atm есть 2, но когда я добавлю вкладку, мне снова нужно будет это сделать) , Я решил это, создав пользовательский класс NavControllerWithBackground и использую его. В ViewDidLoad я добавил код var imageView .... Но проблема остается (почти) одинаковой: с последней строкой изображение невидимо, без последней строки изображение находится поверх всего (за исключением вкладок). – Glenn

+0

Моя цель - создать дочерний класс UIViewController, который задает фоновое изображение и выводит из него все ваши контроллеры. – Bisca

ответ

1

Возможно, самый простой способ был бы: Установите изображение в качестве colorWithPatternImage в backgroundColor вашего UITabBarController, как это:

[tabbarController.view setBackgroundColor:UIColor colorWithPatternImage:yourImage]; 

затем убедитесь, чтобы установить backgroundColor взгляды все его viewControllers к clearColor.

0

Предложение от MarkHim было основой для решения. Однако это не сработало полностью, и мне пришлось добавить кое-что, чтобы заставить ik выглядеть нормально. Для тех, кто хочет достичь того же, вот что я должен был сделать:

подкласс мой UITabBarController и UINavigationController и реализовать ViewDidLoad установки это фон для clearColor:

импорт UIKit

class TMSplitViewController : UISplitViewController { 



override func viewDidLoad() { 
    super.viewDidLoad() 
    self.view.backgroundColor = UIColor.clearColor() 
} 

}

Это (и установка BackgroundColor к clearColor везде в IB, где я мог думать решить большинство проблем.

Однако при переходе от masterView к detailView возникла проблема с iPhones: анимация не была приятной, были артефакты. После анимации это выглядело нормально.Я нашел не очень хороший способ, чтобы решить эту проблему, так что я установил его на месте, добавив следующий код на DetailViewController:

if self.view.traitCollection.horizontalSizeClass == UIUserInterfaceSizeClass.Compact { 
     var imageView = UIImageView(frame: self.view.frame) 
     var image = UIImage(named: "bg.png")! 
     imageView.image = image 
     self.view.addSubview(imageView) 
     self.view.sendSubviewToBack(imageView) 
    } else { 
     self.view.backgroundColor = UIColor.clearColor() 
    } 

Так что для всех горизонтальных компактных макетов (все айфоны, за исключением iPhone 6+ в ландшафте) мы загружаем фоновое изображение, для других мы устанавливаем прозрачность.

Вещи выглядят хорошо в настоящее время

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