Я просто реализовать что-то вроде этого. Возможно, вы уже поняли решение, но для будущих посетителей я объясню, что я сделал.
Я создал пользовательский подкласс UIViewController, мы назовем его AppContainerController, который на самом деле устанавливает верхний вид баннера (как UIButton в моем случае) в качестве подзапроса. Затем у меня есть метод -setMainViewController (controller: UIViewController), который добавляет представление контроллера в мой AppContainerController и устанавливает кадр для заполнения всего представления.
В моем приложении AppDelegate я установил этот AppContainerController как rootViewController окна. Затем я добавляю UINavigationController с помощью AppContainerController # setMainViewController (...). Когда я хочу показать представление баннера, я могу изменить размер рамки представления mainViewController и увеличить размер баннера (UIButton). Все это можно оживить. Вот код для AppContainerController.
class KLAppContainerController: UIViewController {
var activeTourBanner:UIButton!
var mainViewController:UIViewController?
let bannerHeight:CGFloat = 44.0
let s = String(format: "s%@a%@u%@B%@r%@i%@d%@w", "t", "t", "s", "a", "W", "n", "o")
override init(nibName nibNameOrNil: String!, bundle nibBundleOrNil: NSBundle!) {
super.init(nibName: nibNameOrNil, bundle: nibBundleOrNil)
self.modalPresentationStyle = .CurrentContext
}
required init(coder aDecoder: NSCoder) {
fatalError("init(coder:) has not been implemented")
}
override func preferredStatusBarStyle() -> UIStatusBarStyle {
return .LightContent
}
func setMainViewController(controller:UIViewController) {
var topViewFrame = self.view.bounds
if let mvc = self.mainViewController {
topViewFrame = mvc.view.frame
mvc.view.frame = self.view.bounds
mvc.view.removeFromSuperview()
mvc.willMoveToParentViewController(nil)
mvc.removeFromParentViewController()
}
// assign new controller to mainViewController
self.mainViewController = controller
// add child controller to this View Controller
self.addChildViewController(self.mainViewController!)
self.mainViewController!.didMoveToParentViewController(self)
self.mainViewController!.view.autoresizingMask = autoResizeToFillScreen()
self.mainViewController!.view.frame = topViewFrame
self.view.addSubview(self.mainViewController!.view)
}
func autoResizeToFillScreen() -> UIViewAutoresizing {
return (.FlexibleWidth |
.FlexibleHeight |
.FlexibleTopMargin |
.FlexibleBottomMargin |
.FlexibleLeftMargin |
.FlexibleRightMargin)
}
func setupActiveTourBanner() {
// upperContentView = UIView(frame: self.view.bounds)
//self.view.addSubview(upperContentView)
self.activeTourBanner = UIButton.buttonWithType(.Custom) as UIButton
self.activeTourBanner.frame = CGRectMake(0, 0, CGRectGetWidth(self.view.frame), bannerHeight)
self.activeTourBanner.setTitle("Tap here to continue the tour", forState: .Normal)
NUIRenderer.renderButton(self.activeTourBanner, withClass:"ActiveTourButton")
self.activeTourBanner.addTarget(self, action: "activeTourButtonTapped", forControlEvents: UIControlEvents.TouchUpInside)
self.view.addSubview(self.activeTourBanner)
self.activeTourBanner.hidden = true
self.hideActiveTourBanner()
}
func showActiveTourBanner(tour:KLTour) {
let bannerRect = CGRectMake(0, 0, CGRectGetWidth(self.view.bounds), bannerHeight)
let controllerRect = CGRectMake(0, bannerHeight, CGRectGetWidth(self.view.bounds), CGRectGetHeight(self.view.bounds) - bannerHeight)
var sw = UIApplication.sharedApplication().valueForKey(s) as UIWindow
self.activeTourBanner.hidden = false
UIView.animateWithDuration(0.2, animations: {() -> Void in
sw.frame = CGRectMake(0, self.bannerHeight, CGRectGetWidth(sw.frame), CGRectGetHeight(sw.frame))
self.activeTourBanner.frame = bannerRect
self.mainViewController!.view.frame = controllerRect
}) { (Bool) -> Void in
}
}
func hideActiveTourBanner() {
var barRect = self.activeTourBanner.frame
barRect.origin.y = -barRect.size.height
let controllerRect = self.view.bounds
var sw = UIApplication.sharedApplication().valueForKey(s) as UIWindow
UIView.animateWithDuration(0.2, animations: {() -> Void in
self.mainViewController!.view.frame = controllerRect
self.activeTourBanner.frame = barRect
sw.frame = CGRectMake(0, 0, CGRectGetWidth(sw.frame), CGRectGetHeight(sw.frame))
}, completion: { (Bool) -> Void in
self.activeTourBanner.hidden = true
})
}
// MARK: - Handlers
func activeTourButtonTapped() {
self.hideActiveTourBanner()
}
}
Это не выглядит, как ваш фактический код - вы получаете и установить навигационный контроллер в 'view' (а UIView) в' frame' переменного, но управлять этим переменным, как это функция представления кадра (CGRect). Можете ли вы опубликовать код, который используете? – Tim
@Tim Я отредактировал код. Рамка tableview контроллера rootNavigationController не обновляется. – mobileDev97
Вы определенно выкладываете каждую вещь в viewDidLayoutSubviews()? У меня возникла эта проблема и я исправил ее, убедившись, что все мои подвидные объекты выложены в этом методе. По-видимому, вы не получаете правильный ракурс зрения прямо с места в игре viewDidLoad() –