2013-04-28 14 views
24

新しいYahoo!天気アプリで見られるのと同様の効果を出そうとしています。基本的に、UIPageViewControllerの各ページには背景画像があり、ページビューをスクロールすると、画像の位置は約半分の速度でしかスクロールしません。どうすればいい? UIPageViewControllerで何らかの委任方法を使って現在のオフセットを取得し、そのような画像を更新できると思った。唯一の問題は、UIPageViewControllerがスクロールされているかどうかわからないことです。そのための方法はありますか?ありがとう!UIPageViewControllerがスクロールしているときに通知する(画像の視差スクロール)

答えて

46
for (UIView *view in self.pageViewController.view.subviews) { 
    if ([view isKindOfClass:[UIScrollView class]]) { 
     [(UIScrollView *)view setDelegate:self]; 
    } 
} 

)あなたにスクロールしたコントローラで知っているとパーセンテージを得るためにあなたの配列にあなたのコントローラを保存する必要があります。 これはプライベートアップルAPIを使用していません。 scrollview.contentOffsetに注意してください :

は私が100%に UIPageViewControllerの内側のスクロールビュー WARNINGを見つけ、サブビューを横断追加しました。コントローラが新しいページにスクロールするとリセットされます

scrollviewオフセットトラッキングとそのようなものが必要な場合は、UICollectionViewControllerを使用して、コレクションビュー自体とページングを有効にしたセルを使用する方がよいでしょう。

私はこれだろう
+7

Appleが自分のページビューコントローラのアーキテクチャを変更した場合、あなたは困惑しています。 –

+1

@VanDuTranは合意しましたが、それまでは、すべてが良い、と最高のアプローチのように思えます。私は代替案を見ない –

+3

それは私のための最初のサブビューではなく、2番目のサブビューでした。このコードはそれを行いました: 'if([self.pageVC.view.subviews [1] respondsToSelector:@selector(setDelegate:)]){ [self.pageVC.view.subviews [1] setDelegate:self]; } ' – Whoa

3

私の推測では、ではなく、 UIPageViewControllerですが、むしろページされたUIScrollViewです。 UIScrollView は、では、スクロールが行われるときに何が起きているかを追跡する、絶えず繰り返されるデリゲートメソッドを提供します。

UIPageViewControllerが密かに使用しているページングされたUIScrollViewにアクセスできる可能性がありますが、何かが壊れている可能性があります。

+1

をUIPageViewControllerでこれを行う方法があるに違いありません。私はそれを使用すればすべてを単純化します。 Yahoo Appは、UIPageViewControllerも使用しているようです。 UIViewController自体の中から画面上の位置を取得する方法はありますか? –

+1

UIPageViewControllerは基本的に単なるUIScrollViewではありませんか? –

+0

UIPcrollView単独では、スクロールスタイルのUIPageViewControllerが存在する前に、スクロールスタイルのUIPageViewControllerのようなものをやっていたことがわかります。それを行う方法を説明するWWDCビデオが全部あります。 – matt

1

あなたが探しているものは、視差スクロールと呼ばれています。それを手助けできるライブラリがいくつかあります。

編集:マットは正解です。これは答えではなく、ヒントです。とにかく者はそれを完了してみましょう:

あなたはそれが提供するデリゲートメソッドを使用する必要がありますあなたのUIPageViewController背後に横たわっていた背景画像をアニメーション化するために:これらの2つの方法で

-[id<UIPageViewControllerDelegate> pageViewController:willTransitionToViewControllers:] 
-[id<UIPageViewControllerDelegate> pageViewController:didFinishAnimating:previousViewControllers:transitionCompleted:] 

あなたはスクロールの割合を計算することができます(これはあなたがすべての標準スクロールビューのAPIメソッドにアクセスすることができます

+3

それは答えではありません。 – matt

+1

あなたはその割合をどのように取得しますか? –

+1

検索されたビューコントローラの位置を ' - [NSArray indexOfObject:]'で取得する必要があります。次に、 ' - [NSArray count] 'のインデックスの割合を得るための基本的な計算ができます。 –

12

のObjective-C

for (UIView *v in self.pageViewController.view.subviews) { 
    if ([v isKindOfClass:[UIScrollView class]]) { 
     ((UIScrollView *)v).delegate = self; 
    } 
} 

と、このプロトコルを実装する

- (void)scrollViewDidScroll:(UIScrollView *)scrollView 

スウィフト

for view in self.pageViewController.view.subviews { 
    if let scrollView = view as? UIScrollView { 
    scrollView.delegate = self 
    } 
} 

と、このプロトコル

func scrollViewDidScroll(scrollView: UIScrollView) 
+0

スウィフトコード作品をありがとう –

2

使用@パウロのスニペットを実装 -

for (UIView *v in self.pageViewController.view.subviews) { 
if ([v isKindOfClass:[UIScrollView class]]) { 
    ((UIScrollView *)v).delegate = self; 
} 
} 

このプロトコルを実装する:これはあなたのスクロールの完了率を与える-(void)scrollViewDidScroll:(UIScrollView *)scrollView

-(void)scrollViewDidScroll:(UIScrollView *)scrollView 
{ 
CGPoint point = scrollView.contentOffset; 

float percentComplete; 
percentComplete = fabs(point.x - self.view.frame.size.width)/self.view.frame.size.width; 
NSLog(@"percentComplete: %f", percentComplete); 
} 

を。ハッピーコーディング!

あなたも短く、それを書くことができスウィフト3では
1

if let scrollView = self.pageViewController.view.subviews.first(where: { $0 is UIScrollView }) as? UIScrollView { 
    scrollView.delegate = self 
} 
0
extension UIPageViewController { 

    var scrollView: UIScrollView? { 

     return view.subviews.filter { $0 is UIScrollView }.first as? UIScrollView 
    } 
} 

を使用する:

pageController.scrollView?.delegate = self 
関連する問題