質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.48%
Swift 2

Swift 2は、Apple社が独自に開発を行っている言語「Swift」のアップグレード版です。iOSやOS X、さらにLinuxにも対応可能です。また、throws-catchベースのエラーハンドリングが追加されています。

Q&A

1回答

3570閲覧

scrollViewDidEndScrollingAnimationが呼ばれない

tatsuya10088

総合スコア19

Swift 2

Swift 2は、Apple社が独自に開発を行っている言語「Swift」のアップグレード版です。iOSやOS X、さらにLinuxにも対応可能です。また、throws-catchベースのエラーハンドリングが追加されています。

0グッド

0クリップ

投稿2017/04/05 10:15

編集2017/04/06 06:46

以下のメソッドがcollectionViewのスクロール後に呼ばれないです。
原因がわからない状態です。

// MARK: - UIScrollViewDelegate extension TabView: UICollectionViewDelegate { func scrollViewDidScroll(scrollView: UIScrollView) { if scrollView.dragging { currentBarView.hidden = true let indexPath = NSIndexPath(forItem: currentIndex, inSection: 0) if let cell = collectionView.cellForItemAtIndexPath(indexPath) as? TabCollectionCell { cell.showCurrentBarView() } } guard isInfinity else { return } if pageTabItemsWidth == 0.0 { pageTabItemsWidth = floor(scrollView.contentSize.width / 3.0) } if (scrollView.contentOffset.x <= 0.0) || (scrollView.contentOffset.x > pageTabItemsWidth * 2.0) { scrollView.contentOffset.x = pageTabItemsWidth } } func scrollViewDidEndScrollingAnimation(scrollView: UIScrollView) { // Accept the touch event because animation is complete updateCollectionViewUserInteractionEnabled(true) guard isInfinity else { return } let indexPath = NSIndexPath(forItem: currentIndex, inSection: 0) if shouldScrollToItem { // After the moved so as not to sense of incongruity, to adjust the contentOffset at the currentIndex collectionView.scrollToItemAtIndexPath(indexPath, atScrollPosition: .CenteredHorizontally, animated: false) shouldScrollToItem = false } } }
func moveCurrentBarView(indexPath: NSIndexPath, animated: Bool, shouldScroll: Bool) { if shouldScroll { collectionView.scrollToItemAtIndexPath(indexPath, atScrollPosition: .CenteredHorizontally, animated: animated) layoutIfNeeded() collectionViewContentOffsetX = 0.0 currentBarViewWidth = 0.0 } if let cell = collectionView.cellForItemAtIndexPath(indexPath) as? TabCollectionCell { currentBarView.hidden = false if animated && shouldScroll { cell.isCurrent = true } cell.hideCurrentBarView() currentBarViewWidthConstraint.constant = cell.frame.width if !isInfinity { currentBarViewLeftConstraint?.constant = cell.frame.origin.x } UIView.animateWithDuration(0.2, animations: { self.layoutIfNeeded() }, completion: { _ in if !animated && shouldScroll { cell.isCurrent = true } if !self.isInfinity { self.updateCollectionViewUserInteractionEnabled(true) } }) } beforeIndex = currentIndex }

TabViewは以下のように設定しています!

イメージ説明

回答よろしくおねがいします!!

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

fuzzball

2017/04/06 07:23

moveCurrentBarView()内の if shouldScroll { の次の行に print(indexPath, animated, shouldScroll) を追加して、出力を教えて下さい。
guest

回答1

0

TabViewとは何でしょうか?画像のどれに当たるものですか?もしかしてUIViewControllerのサブクラスですか?

何にせよ、scrollViewDidEndScrollingAnimation:が呼ばれるのは、setContentOffset:animatedでanimatedにtrueを渡すなどして、コードでスクロールアニメーションした時にスクロールが停止したタイミングで呼ばれるものです。

なので指でスクロールした場合は呼ばれません。
そのタイミングで処理をしたい場合は他のメソッドを使用してください。

投稿2017/04/05 13:34

u39ueda

総合スコア950

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

tatsuya10088

2017/04/06 00:24

ご回答ありがとうございます! TabViewはUIViewControllerのサブクラスです。 scrollView.contentOffset = CGPointなどでスクロールしても呼ばれないですか??
u39ueda

2017/04/06 00:32

その方法だとアニメーションしないので呼ばれないです。呼ばれるのはanimatedにtrueを渡した時だけです。
tatsuya10088

2017/04/06 00:47

ご回答ありがとうございます! scrollToItemAtIndexPath(indexPath, atScrollPosition: .CenteredHorizontally, animated: false) この場合だとよばれますかね??
u39ueda

2017/04/06 01:07

呼ばれないです。呼ばれるのはanimatedに**true**を渡した時だけです。
tatsuya10088

2017/04/06 01:12

ご回答ありがとうございます! ごめんなさい間違いました。 `scrollToItemAtIndexPath(indexPath, atScrollPosition: .CenteredHorizontally, animated: true) この場合だとよばれますかね??` でした。 この設定をしてもよばれないんですよ。 何度も質問して申し訳ないです。
fuzzball

2017/04/06 03:50 編集

CenteredHorizontallyで間違いないですか?縦スクロールならCenteredVerticallyですよ。
tatsuya10088

2017/04/06 01:29

ご回答ありがとうございます! 横スクロールで間違いないです!
u39ueda

2017/04/06 01:31

アニメーション自体はちゃんと実行されますか?実行されるならどうやって呼ばれていないと判断しましたか?メソッド内にprintを挟んで確認しましたか?
tatsuya10088

2017/04/06 01:52

アニメーション自体はきちんと実行されています! 確認はメソッドにprint文やブレイクポイントをつかって確認しています!
u39ueda

2017/04/06 02:38

うーん、他に原因がある気がしますね。TabViewにscrollViewDidScroll(_ scrollView: UIScrollView)を実装してみてください。指でスクロールした時に呼ばれますか?呼ばれないならTabViewがdelegateに設定されてないと思うので、設定の仕方が間違っていると思います。
tatsuya10088

2017/04/06 03:01

ご回答ありがとうございます! scrollViewDidScroll(_ scrollView: UIScrollView)は呼ばれているのでdelegateは正しく設定されていると思います。
u39ueda

2017/04/06 03:51

Swift2なんですよね?scrollViewDidEndScrollingAnimation(_ scrollView: UIScrollView)の`_`は不要です。
tatsuya10088

2017/04/06 04:25

ご回答ありがとうございます。 そうです。scrollViewDidScroll(scrollView: UIScrollView)で書いてあります!
u39ueda

2017/04/06 04:29

scrollViewDidEndScrollingAnimationの方も`_`を付けていないのですか?質問文の方には付いていますが。
tatsuya10088

2017/04/06 04:45

ご回答ありがとうございます! はい。つけていないです! 紛らわしくてすみません!
fuzzball

2017/04/06 04:57

scrollViewDidScroll()を追加した状態のコードで質問を更新して下さい。
u39ueda

2017/04/06 05:46

fuzzballさん ありがとうございます。 tatsuya10088さん 一緒にscrollToItemAtIndexPathを呼んでいる周辺のコードも追加してもらえますか?
u39ueda

2017/04/06 06:42

ここじゃなくて質問文を修正してください。どこかに「編集」とかのボタンがあるはずですので。
tatsuya10088

2017/04/06 06:47

すみません! 編集しました!!
fuzzball

2017/04/06 06:52

こっちのコードは削除して下さい。見にくいです。 質問の方のコードはインデントが消えているのでコピペし直して下さい。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

まだベストアンサーが選ばれていません

会員登録して回答してみよう

アカウントをお持ちの方は

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.48%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問