2014-08-23 4 views
2

У меня есть UINavigationController, который добавлен в качестве контроллера дочернего представления в класс UIViewController контейнера. Мне нужно динамически отображать представление баннера над представлением навигационного контроллера. Я изменяю размер представления контроллера навигации, но я не могу изменить размер представления контроллера контроллера детского просмотра контроллера.Как изменить размер кадра контроллера представления UINavigationController после его изменения

// этот код обновляет представление контроллера навигации, но не обновляет высоту представления его контроллера детского представления.

self.updateViewYOffset(self.rootNavigationController.view, yOffset: yOffset) 

func updateViewYOffset(view: UIView, yOffset: CGFloat) { 
    var frame = view.frame 
    frame.origin.y = yOffset 
    frame.size.height = self.view.frame.size.height - yOffset 
    view.frame = frame 
} 

// если iPhone 5s - высота вид на навигационный контроллер в настоящее время 538 (568-30), но высота вид своего потомка зрения контроллера еще 568.

+0

Это не выглядит, как ваш фактический код - вы получаете и установить навигационный контроллер в 'view' (а UIView) в' frame' переменного, но управлять этим переменным, как это функция представления кадра (CGRect). Можете ли вы опубликовать код, который используете? – Tim

+0

@Tim Я отредактировал код. Рамка tableview контроллера rootNavigationController не обновляется. – mobileDev97

+0

Вы определенно выкладываете каждую вещь в viewDidLayoutSubviews()? У меня возникла эта проблема и я исправил ее, убедившись, что все мои подвидные объекты выложены в этом методе. По-видимому, вы не получаете правильный ракурс зрения прямо с места в игре viewDidLoad() –

ответ

0

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

Я создал пользовательский подкласс 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() 
} 

}

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