2013-08-23 5 views
39

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

enter image description here

+0

Это может быть полезно. http: // stackoverflow.com/questions/17684922/change-uipageviewcontroller-own-pagecontroller-about-color-of-dots http://stackoverflow.com/questions/17466718/can-we-customize-the-page-indicator-in -uipageviewcontroller –

ответ

73

Вы можете использовать appearance, чтобы изменить цвет UIPageControl в противном случае она не доступна. Попробуйте сделать это в своей функции AppAppDelegate, как показано ниже.

- (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions 
{ 
    UIPageControl *pageControl = [UIPageControl appearance]; 
    pageControl.pageIndicatorTintColor = [UIColor lightGrayColor]; 
    pageControl.currentPageIndicatorTintColor = [UIColor blackColor]; 
    pageControl.backgroundColor = [UIColor blueColor]; 

    return YES; 
} 

Чтобы применить стиль только к определенному контроллеру вида, вы можете использовать appearanceWhenContainedIn вместо следующим образом:

UIPageControl *pageControl = [UIPageControl appearanceWhenContainedIn:[MyViewController class], nil]; 

только UIPageControl объекты, содержащиеся в MyViewController собираются получить этот стиль.

EDIT: черный фон вокруг UIPageControl в нижней части экрана, связано с цветом фона вашей UIPageViewController не UIPageControl. Вы можете изменить этот цвет следующим образом:

- (void)viewDidLoad { 
    [super viewDidLoad]; 
    self.view.backgroundColor = [UIColor blueColor]; //Set it to whatever you like 
} 
+2

спасибо, но на самом деле он не мог сделать его прозрачным, чтобы я мог показать, что находится под ним ([uicolor clearcolor]). однако это ценная информация. у меня есть вопрос и надеюсь, что вы дадите мне больше информации. как он узнает, какой pageControl я нацеливаюсь? как выглядит внешний вид? Спасибо огромное! – user1938695

+0

@ user1938695 Если вы хотите, чтобы он был прозрачным, возьмите последнюю строку его кода и измените его следующим образом: 'pageControl.backgroundColor = [[UIColor blueColor] colorWithAlphaComponent: 0.5f];' – BrianS

+0

Это меня закрыло, но я по-прежнему не может обеспечить прозрачность фона. –

8

Просто подкласс UIPageViewController и добавьте этот код:

- (void)viewDidLayoutSubviews { 
    [super viewDidLayoutSubviews]; 
    for (UIView *view in self.view.subviews) { 
    if ([view isKindOfClass:[NSClassFromString(@"_UIQueuingScrollView") class]]) { 
     CGRect frame = view.frame; 
     frame.size.height = view.superview.frame.size.height; 
     view.frame = frame; 
    } 
    } 
} 

Это позволит увеличить внутреннюю рамку просмотра прокрутки.

+3

Пришлось добавить [self.view sendSubviewToBack: view]; в инструкции if, чтобы он работал правильно здесь. – Matthijn

+0

@orkenstein не работает. – ChenSmile

+0

Это делает мой взгляд «прыгать», когда я нажимаю на него, чтобы перейти к следующей странице. Я не знаю, как это исправить. – TheJeff

8

Добавить следующий код в UIPageViewController.

- (void)viewDidLoad { 
    [super viewDidLoad]; 
    [[UIPageControl appearance] setPageIndicatorTintColor: [UIColor grayColor]]; 
    [[UIPageControl appearance] setCurrentPageIndicatorTintColor: [UIColor whiteColor]]; 
    [[UIPageControl appearance] setBackgroundColor: [UIColor darkGrayColor]]; 
} 
20

Обновление для Swift 3:

override func viewDidLayoutSubviews() { 
    super.viewDidLayoutSubviews() 
    for view in self.view.subviews { 
     if view is UIScrollView { 
      view.frame = UIScreen.main.bounds 
     } else if view is UIPageControl { 
      view.backgroundColor = UIColor.clear 
     } 
    } 
} 

Swift 2 пример для тех, кто нуждается в ней. Поместите это в свой подкласс UIPageController.

override func viewDidLayoutSubviews() { 
    super.viewDidLayoutSubviews() 
    for view in self.view.subviews { 
     if view is UIScrollView { 
      view.frame = UIScreen.mainScreen().bounds 
     } else if view is UIPageControl { 
      view.backgroundColor = UIColor.clearColor() 
     } 
    } 
} 
+0

может усовершенствовать код ур в объекте c – ChenSmile

+0

Привет @Imran - код objC от orkenstein выше по существу тот же. Я просто предлагал пример для других. – jlichti

+0

не работает bro .. – ChenSmile

3

Вот Swift 2 + версия Ответ Yas-T «s

//In AppDelegate 
let pageControl = UIPageControl.appearance() 
pageControl.pageIndicatorTintColor = UIColor.lightGrayColor() 
pageControl.currentPageIndicatorTintColor = UIColor.blackColor() 
pageControl.backgroundColor = UIColor.blueColor() 

//Or in your ViewController (Only available on IOS 9.0) 
if #available(iOS 9.0, *) { 
    let pageControl = UIPageControl.appearanceWhenContainedInInstancesOfClasses([ViewController.self]) 
    pageControl.pageIndicatorTintColor = UIColor.lightGrayColor() 
    pageControl.currentPageIndicatorTintColor = UIColor.darkGrayColor() 
} 
+0

Доступно только на iOS 9.0. – Phil

1

Вот Swift 3+ версия принятого Ответ (с плюсом заказного цвета, созданного) :

func application(_ application: UIApplication, didFinishLaunchingWithOptions launchOptions: [UIApplicationLaunchOptionsKey: Any]?) -> Bool { 

    if #available(iOS 9.0, *) { 

     let pageControl = UIPageControl.appearance(whenContainedInInstancesOf: [UIPageViewController.self]) 
     pageControl.pageIndicatorTintColor = UIColor.init(colorLiteralRed: 43/255.0, green: 170/255.0, blue: 226/255.0, alpha: 0.4) 
     pageControl.currentPageIndicatorTintColor = UIColor.init(colorLiteralRed: 43/255.0, green: 170/255.0, blue: 226/255.0, alpha: 1.0)   
    } 

    return true 
} 
1

Override функция viewDidLayoutSubviews() в PageViewController:

override func viewDidLayoutSubviews() { 
    super.viewDidLayoutSubviews() 

    for view in view.subviews{ 
     if view is UIScrollView{ 
      view.frame = UIScreen.main.bounds 
     }else if view is UIPageControl{ 
      view.backgroundColor = UIColor.clear 
     } 
    } 
}