Цвет границы точки UIPageControl - PullRequest
1 голос
/ 06 августа 2020

Я не могу установить цвет границы контрольной точки страницы в iOS 14. Следующий код работает с iOS <14, но не с iOS 14: </p>

for (int i = 0; i < [self.subViews count]; i++) {
    UIView *dot = [self.subViews objectAtIndex:i];
    dot.layer.borderWidth = 1;
    dot.layer.borderColor = [UIColor blueColor].CGColor;
}

Цвет оттенка UIPageControl ясный. Я просто хочу добавить только границу. Для этого нужно решение в Obj- C.

Ответы [ 2 ]

2 голосов
/ 07 августа 2020

Комментарии

  • iOS 14 все еще является бета-версией, и любое решение на основе иерархии представлений может перестать работать со следующей бета-версией.
  • Оно также может перестать работать в любом будущем iOS выпуск (не бета).
  • Вы полагаетесь на иерархию частных представлений. Apple может изменить его в любое время без дополнительного уведомления. IOW он принадлежит к категории использования частного API = вы здесь сами по себе.

Иерархия представлений UIPageControl

iOS 13

enter image description here

iOS 14

enter image description here

New API

Even if you update your code to match the new view hierarchy ...

UIView *pageControlContentView = self.pageControl.subviews[0];
UIView *pageControlIndicatorContentView = pageControlContentView.subviews[0];
[pageControlIndicatorContentView.subviews enumerateObjectsUsingBlock:^(__kindof UIView * _Nonnull obj, NSUInteger idx, BOOL * _Nonnull stop) {
    obj.layer.borderWidth = 1;
    obj.layer.borderColor = UIColor.blueColor.CGColor;
}];

... вы получите что-то вроде этого:

enter image description here

iOS 14 introduced new properties and methods you can use:

Вы можете использовать символы SF, например:

UIImage *image = [UIImage systemImageNamed:@"link.circle.fill"];
self.pageControl.preferredIndicatorImage = image;

Тогда вы получите:

enter image description here

In other words, to be safe, avoid private view hierarchies, use preferredIndicatorImage. You can prepare your own images if you'd like to customize them, etc. But it's a topic for another question. If you'd like to do it programmatically, search for questions как этот .

Поскольку вы используете иерархию частных представлений, изучите свои инструменты (Xcode) и начните с Изучение иерархии представлений и Отладка иерархий представлений главы. В следующий раз ты сам поймешь, в чем проблема.

0 голосов
/ 02 сентября 2020

Ну, я нашел это только как «решение»

До (

Before

After (iOS 14):

введите описание изображения здесь

if #available(iOS 14.0, *) {
            pageControl.currentPageIndicatorTintColor = .blue // custom color
            pageControl.pageIndicatorTintColor = .blue.withAlphaComponent(0.3)
        } else {
            // Fallback on earlier versions
            for index: Int in 0...3 {
                guard pageControl.subviews.count > index else { return }
                let dot: UIView = pageControl.subviews[index]
                dot.layer.cornerRadius = dot.frame.size.height / 2
                if index == pageControl.currentPage {
                    dot.backgroundColor = .blue                        
                    dot.layer.borderWidth = 0
                } else {
                    dot.backgroundColor = UIColor.clear
                    dot.layer.borderColor = UIColor.blue.cgColor
                    dot.layer.borderWidth = 1
                }
            }
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...