私のアプリケーションには、約10ページ(ドット)で完全に見栄えのするUIPageControlがありますが、ユーザーがさまざまなビューを追加できるため、ドットの数は30になる可能性があります。
これが発生すると、ドットが画面の端から消えてしまい、現在選択されているページが常に表示されるとは限らないため、すべてがひどく見えます。
ページコントロールを複数行にする方法、または現在表示されているページが画面から消えた瞬間にページコントロールを左または右にシフトする方法はありますか?
私のアプリケーションには、約10ページ(ドット)で完全に見栄えのするUIPageControlがありますが、ユーザーがさまざまなビューを追加できるため、ドットの数は30になる可能性があります。
これが発生すると、ドットが画面の端から消えてしまい、現在選択されているページが常に表示されるとは限らないため、すべてがひどく見えます。
ページコントロールを複数行にする方法、または現在表示されているページが画面から消えた瞬間にページコントロールを左または右にシフトする方法はありますか?
UIWebViewを含むUIScrollViewを使用するeBookアプリケーションを作成しました。この本は100ページを超えていたため、指摘された問題のためにUIPageControlはそれを処理できませんでした。最終的に、UIPageControlと同様に機能するが、多数のページを処理できるカスタムの「スライダー」タイプのビューを作成しました。それはあなたがする必要があることのほとんどです。UIPageコントロールは必要な数のページを処理できません...
ページ/ドット比を計算し、float値として保存します。次に、現在のドット数を現在のページ/pagesPerDotとして計算します。ドットが動くのを見る前に数ページ進む必要があるかもしれませんが、それは非常にスケーラブルでうまく機能します。
30個のアイテムがある水平コレクションビューの下にUIPageControlを実装する必要がありました。だから私はドットの数を固定してそれらのドットだけをスクロールすることでドットの数を減らすために何をしましたか?コードに従ってください:
@IBOutlet var pageControl: UIPageControl!
var collectionDataList = [String]
let dotsCount = 5
override func viewDidAppear(_ animated: Bool) {
if collectionDataList.count < dotsCount {
self.pageControl.numberOfPages = collectionDataList.count
} else {
self.pageControl.numberOfPages = dotsCount
}
}
func scrollViewDidScroll(_ scrollView: UIScrollView)
{
let pageWidth = scrollView.frame.width
self.currentPage = Int((scrollView.contentOffset.x + pageWidth / 2) / pageWidth)
self.pageControl.currentPage = self.currentPage % dotsCount
}
私の解決策は、ドットの最大数を設定し、ユーザーが最後に到達するまで最後のドットの前にドットを表示することです。現在のページ数が最大ドット数よりも大きい場合、ユーザーが最後に到達するまで、最後のページ数の前のページ数を表示します。
var maxDotCount = 8 //Global constant.
func scrollViewDidEndDecelerating(_ scrollView: UIScrollView) {
let pageWidth = collectionView.frame.size.width
let currentPage = collectionView.contentOffset.x / pageWidth
let pageControlsNumberOfPages = pageControl.numberOfPages - 1
let dataSourceCount = CGFloat(dataSourceArr.count - 1)
let maxDotCountReduced = CGFloat(maxDotCount - 1)
if (dataSourceCount > maxDotCountReduced) {
if (currentPage >= maxDotCountReduced) {
if (currentPage == dataSourceCount) {
pageControl.currentPage = pageControlsNumberOfPages
} else {
pageControl.currentPage = pageControlsNumberOfPages - 1
}
return
}
}
pageControl.currentPage = Int(currentPage)
}