2015-04-01 62 views
0

我想在PageViewController中進行自定義轉換:當用戶移動到下一張幻燈片(滾動)時,背景圖像緩慢地溶解到另一個圖像中。在PageViewController上進行漂亮的轉換

這樣的效果有Apple Weather(除了有背景視頻)。

我做了什麼:

  • 我做了UIViewContoller與背景圖像(即圖像,我需要改變)。
  • 我已經將ContainerView放入該UIViewController中,該ContainerView嵌入了PageViewController。的UIViewController - > ContainerView - > PageViewController

在這一點上我堅持,我有工作與共享的背景圖片(從頂部的UIViewController)PageViewController,但我不知道接下來要去哪裏。

現在我能趕上頁面,我的代表(主要ViewContoller)改變:

func pageChanged(currentPage: Int) {} 

和默認的委託方法(PageViewContoller)(我有2張幻燈片,不知道如何更好地做到這一點):

func pageViewController(pageViewController: UIPageViewController, didFinishAnimating finished: Bool, previousViewControllers: [AnyObject], transitionCompleted completed: Bool) { 
    let prevController = previousViewControllers as [ContentViewController] 
    if completed { 
     if prevController[0].index == 0 { 
      delegate.pageChanged(1) 
     } else { 
      delegate.pageChanged(2) 
     } 
    } 
} 

但它是即時的功能,我不能在這裏做緩慢的動畫中的用戶依賴慢慢刷卡:)。

+0

聽起來你實際上需要使用'UICollectionView'。從這裏你可以訪問'scrollView'委託,並根據你的位置開始進行圖像轉換。 – LyricalPanda 2015-04-01 19:47:10

+0

呃...它會比我想象的更復雜PageViewContoller :(現在我正在考慮使用滑動手勢識別器的技巧。 – Vasily 2015-04-01 20:34:32

回答

-1

我完全同意瓦西里。您需要使用UICollectionView並使用self.collectionView.pagingEnabled = YES;。然後,您可以通過UIScrollViewDelegate完美控制scrollview contentOffset。

optional func scrollViewDidScroll(_ scrollView: UIScrollView) 

的代碼:

func scrollViewDidScroll(scrollView: UIScrollView) { 

    var currentX = scrollView.contentOffset.x 
    var ratio = currentX/UIScreen.mainScreen().bounds.size.width 
    var previousPageIndex = floor(ratio) 
    var nextPageIndex = ceil(ratio) 
    ratio = ratio - previousPageIndex 

} 

舉例來說,如果所述ratio爲0.33,過渡是頁previousPageIndexnextPageIndex的頁面之間33%。您可以在UIImageView的使用爲您設置的阿爾法值這個值:

func scrollViewDidScroll(scrollView: UIScrollView) { 

    var currentX = scrollView.contentOffset.x 
    var ratio = currentX/UIScreen.mainScreen().bounds.size.width 
    var previousPageIndex = floor(ratio) 
    var nextPageIndex = ceil(ratio) 
    ratio = ratio - previousPageIndex 

    fromImageView.alpha = 1.0 - ratio; 
    toImageView.alpha = ratio; 

} 

PageViewController不允許你控制滾動本身。過渡是一個離散的事件。輕掃手勢也是一個離散事件,您可以使用它添加平滑效果。平移手勢可以幫助您,但代碼會更加複雜和骯髒。

+0

沒有必要避免使用UIPageViewController。您可以通過下面的答案訪問它的滾動視圖 – BJHStudios 2016-10-14 00:12:09

1

接受的答案指示您使用UICollectionViewController而不是UIPageViewController,因此您可以訪問UIScrollView,將其設置爲委託並監視scrollViewDidScroll方法。

而不是使用頁面視圖控制器避免,就可以訪問它滾動視圖這樣的:

let scrollView = self.view.subviews.filter { $0 is UIScrollView }.first as? UIScrollView 

然後,您可以設置委託了滾動,享受的scrollViewDidScroll方法等。將UIScrollViewDelegate協議與UIPageViewControllerDelegate協議結合使用可以爲您提供足夠的狀態信息來完成您的需求。

+0

良好的調用!我深知內心深處,我並不需要重寫所有經過測試的頁面視圖控制器代碼。 – mph 2017-05-18 22:32:16