2016-02-09 14 views
0

在我的應用程序中,我在屏幕頂部有一個uview。當我點擊那個UIView時,我有第二個視圖控制器向上滑動。我想完成的是,當第二個視圖控制器滑入屏幕時,它就在它覆蓋UIView之前停下來在覆蓋UIView之前如何停止幻燈片切換到第二個VC?

我試圖完成的是有一個視圖向上滑動,包含商店信息,例如打開小時,地址,電話號碼等等。所以我一直在想我可以擁有另一個視圖控制器來存儲所有這些信息。只有一部分是我想停止它滑動,因此它與頂部的uiview欄齊平。

​​
+1

第二個控制器沒有參考第一個控制器中的視圖。相反,您應該嘗試使用uview而不是uview控制器,然後您可以輕鬆找出兩個uiviews是否觸及。 –

+0

所以你是說我應該創建一個自定義幻燈片動畫的UIView滑入屏幕?對於iOS編程還是比較新的,你可能知道的任何鏈接都可以將我引導到一個我可以學習如何做到這一點的地方? – lifewithelliott

+0

我認爲你對如何去做這件事有錯誤的想法。你知道如何以模態方式呈現和解散控制器嗎? – Mihado

回答

2

這聽起來像你的目標是:

  1. 有一個基本視圖
  2. 幻燈片第二視圖中途上來就先

假如是這樣的話,有有多種方式可以實現這一點,但蘋果可能會推薦View Controller Containment。要做到這一點,您將擁有:

  1. A SlidingContainerViewController
    • 這是一個自定義的容器視圖控制器,將持有我們的另外兩個視圖控制器
  2. 一些背景知識 - 視圖 - 控制器
  3. 一些前景視圖控制器

這裏是一個基本實現的定製SlidingContainerViewController

// SlidingContainerViewController.swift 

import UIKit 

class SlidingContainerViewController: UIViewController { 

    //MARK: - Init 
    init(frontViewController: UIViewController, backViewController: UIViewController) { 
     super.init(nibName: nil, bundle: nil) 
     frontViewContoller = frontViewController 
     backViewContoller = backViewController 
    } 

    required init?(coder aDecoder: NSCoder) { 
     fatalError("init(coder:) has not been implemented") 
    } 

    //MARK: - Public 
    var frontViewContoller: UIViewController = UIViewController() 
    var backViewContoller: UIViewController = UIViewController() 
    var splitOriginY: CGFloat = 160.0 

    func toggleFrontView() { 
     if frontIsVisible { 
      UIView.animateWithDuration(0.4) { 
       self.frontViewContoller.view.frame.origin.y = self.view.frame.height 
       self.frontIsVisible = false 
      } 
     } else { 
      UIView.animateWithDuration(0.4) { 
       self.frontViewContoller.view.frame.origin.y = self.splitOriginY 
       self.frontIsVisible = true 
      } 

     } 
    } 

    //MARK: - ViewLifecycle 
    override func viewDidLoad() { 
     super.viewDidLoad() 
     addChild(backViewContoller) 
     addChild(frontViewContoller) 
     self.frontViewContoller.view.frame.origin.y = self.view.frame.height 
    } 

    //MARK: - Private 
    var frontIsVisible = false 

    private func addChild(viewController: UIViewController) { 
     addChildViewController(viewController) 
     view.addSubview(viewController.view) 
     viewController.view.frame = view.bounds 
     viewController.didMoveToParentViewController(self) 
    } 

} 

然後,您可以將所需的任何自定義視圖控制器放入此容器視圖控制器。底部視圖控制器只需要在容器視圖控制器上調用toggleFrontView(),只要它想要幻燈片發生。

下面我添加了兩個示例視圖控制器用於演示目的。 您可以在github查看整個項目:SlidingVC

SlidingContainerViewController

*注意:此方法是通過編程實現,而不Interface Builder中。我親自以這種方式完全用代碼構建了我的所有應用程序。如果您希望使用Interface Builder,則可以使用Storyboard和自定義segues完成相同的操作。這裏是一個相關的教程:A Beginner’s Guide to Animated Custom Segues in iOS 8

+0

非常棒!虐待嘗試,看看我能否正確實施這個儘快!穿過github,看到你向代表添加了代碼,以及我沒有看到主要的故事板?仍然是一個新手,所以我不完全瞭解它,但我一定會看到我能做什麼:) – lifewithelliott

+0

你能夠以編程方式做到這一點,但我也想知道這是否只是一種更先進的開發應用程序或如果你要在界面構建器中設計這個代碼,那麼它會不會有所不同?這樣在IB中執行容器視圖。通過segue連接它們,添加輕擊手勢識別器,然後添加代碼以允許視圖使用performSegueWithIdentifier滑入屏幕。 – lifewithelliott

+0

根據我的經驗,大多數iOS開發人員廣泛使用Interface Builder。我過去使用過它,但現在我完全用代碼完成所有工作。對我而言,我是一名程序員,因此在代碼中做所有事情感覺更合適,而不是在IB中隱藏一些設置,並且隱藏在代碼中。我在答覆的底部添加了一條註釋以解決此問題。 – bearMountain