2015-06-19 7 views
3

Я реализую простой контроллер просмотра галереи, где приложение отображает небольшой диапазон полноэкранных изображений, которые пользователь может прокручивать. Я использую UIPageViewController, который, как я думал, должен автоматически отображать индикаторы страницы, если я реализую правильные функции источника данных. Однако я все еще не вижу никаких индикаторов.Swift/iOS8: Почему индикаторы контроля страниц не отображаются?

В моей главной GalleryViewController:

class GalleryViewController: UIViewController, UIPageViewControllerDataSource, UIPageViewControllerDelegate { 

var pageController: UIPageViewController? 
var pageContent = NSArray() 

override func viewDidLoad() { 
super.viewDidLoad() 
.... some code to load images into the pageContent array .... 

pageController = UIPageViewController(transitionStyle:.Scroll, navigationOrientation:.Horizontal,options:nil) 
pageController?.delegate = self 
pageController?.dataSource = self 

... some more standard code to add the page controller to self.view etc. 

var pageControl = UIPageControl.appearance() 
pageControl.pageIndicatorTintColor = UIColor.lightGray() 
pageControl.currentPageIndicatorTintColor = UIColor.whiteColor() 
pageControl.backgroundColor = UIColor.blackColor() 

pageController!.didMoveToParentViewController(self) 
} 

func viewControllerAtIndex(index:Int) -> ContentViewController? { 
.... 
} 

Я реализовал два обязательных методов протокола viewControllerBeforeViewController и viewControllerAfterController, а также два обязательных для них подкачки, presentationCountForPagesViewController и presentationIndexForPageViewController.

У меня ContentViewController есть UIImageView, который заполняет весь экран. Однако даже когда я уменьшаю его размер в нижней части экрана, я не вижу никаких индикаторов на странице. Я что-то пропустил? Дайте мне знать, если я не предоставил достаточную информацию. Я пытался переписать старое приложение, которое я закодировал в Objective-C более 5 лет назад - полностью в Swift для iOS8 и Xcode и т. Д. Так сильно изменилось, что это сбивает с толку. Спасибо!

ответ

14

Взятые из here:

Для того, чтобы показать UIPageControl, необходимо реализовать два дополнительных метода DataSource. Просто вернуть целое число страниц для presentationCountForPageViewController и первоначально выбранный индекс для presentationIndexForPageViewController

func presentationCountForPageViewController(pageViewController: UIPageViewController) -> Int { 
    return pageContent.count 
} 

func presentationIndexForPageViewController(pageViewController: UIPageViewController) -> Int { 
    return 0 
} 
+2

Я сделал именно это - до сих пор не отображается. –

+0

Я положил инструкцию println для отладки внутри моего метода presentationCountForPageViewController и никогда не вызывается. Может быть, поэтому мои счетчики страниц не отображаются, но почему он не вызван? Является ли счетчик страниц автоматически создан с помощью UIPageViewController? –

+0

Вы никогда не добавляете pageController.view как подзаголовок self.view. – jrc

14

Почему бы не использовать быструю версию ответа Zell B. «s 3+

func presentationCount(for pageViewController: UIPageViewController) -> Int { 
     return self.providerItemList?.providerItems?.count ?? 0 
    } 

    func presentationIndex(for pageViewController: UIPageViewController) -> Int { 
     return 0 
    } 
+2

Это сделало это для меня. Старые имена методов (например: 'func presentationCountForPageViewController') не были помечены в Xcode и все еще были полностью действительны. При переключении на новые имена методов теперь отображаются индикаторы управления страницей. – Alexander

+0

такой же для меня! – philthomas26

4

Даже если вы измените цвет UIPageControl, он может не отображаться. Если UIPageController находится внутри UITabBarController, TabBar будет охватывать UIPageControl. Лучший способ найти это вариант использования Debug-> Просмотр Debubging-> CaptureViewHierarchy. Затем в левом нижнем поле фильтра введите «pageControl». Если щелкнуть его в навигаторе он должен найти его на экране (взгляните на скриншот)

enter image description here

Вы можете изменить позицию так:

let controlHeight: CGFloat = 50 
    let bottomSpace: CGFloat = 20 
    let yPosition = view.frame.size.height - (controlHeight + bottomSpace) 
    let fullScreenWidth = view.frame.size.width 
    let frame = CGRect(x: 0, y: yPosition, width: fullScreenWidth, height: controlHeight) 

    pageControl.frame = frame 
+0

Вы просто забыли упомянуть, как это исправить! – JoeGalind

+1

@JoeGalind Я добавил несколько базовых решений. – milczi

0

Моя ошибка заключалась в том установите значение счетчика больше, чем фактические страницы содержимого в моем контроллере просмотра страницы в методе делегата presentationCount().