Подтвердить что ты не робот

Ios Изменение цвета полосы прокрутки UIScrollView на разные цвета

Как мы можем изменить цвет индикатора прокрутки UIScrollview на что-то вроде синего, зеленого и т.д.

Я знаю, что мы можем изменить его на белый, черный. Но другие тогда эти цвета.

Большое спасибо

4b9b3361

Ответ 1

К сожалению, вы не можете, конечно, вы всегда можете сворачивать свои собственные. Это ваши варианты:

UIScrollViewIndicatorStyleDefault:

По умолчанию используется индикатор прокрутки, черный с белой рамкой. Этот стиль хорош для любого контента.

UIScrollViewIndicatorStyleBlack:

Стиль индикатора черного цвета и меньше, чем стиль по умолчанию. Этот стиль хорош на фоне белого контента.

UIScrollViewIndicatorStyleWhite:

Стиль индикатора белый и меньше, чем стиль по умолчанию. Этот стиль хорош на фоне черного контента.

Ответ 2

Здесь более безопасный Swift 3 метод:

func scrollViewDidScroll(_ scrollView: UIScrollView) {
    let verticalIndicator = scrollView.subviews.last as? UIImageView
    verticalIndicator?.backgroundColor = UIColor.green
}

Ответ 3

  Оба индикатора UIScrollView являются вложенным видом UIScrollView. Так что мы можем получить доступ к подпредставлению UIScrollView и изменить свойство подпредставления.

1.Добавить UIScrollViewDelegate

@interface ViewController : UIViewController<UIScrollViewDelegate>
@end

2. Добавьте scrollViewDidScroll в раздел реализации

-(void)scrollViewDidScroll:(UIScrollView *)scrollView1
{
    //get refrence of vertical indicator
    UIImageView *verticalIndicator = ((UIImageView *)[scrollView.subviews objectAtIndex:(scrollView.subviews.count-1)]);
    //set color to vertical indicator
    [verticalIndicator setBackgroundColor:[UIColor redColor]];


    //get refrence of horizontal indicator
    UIImageView *horizontalIndicator = ((UIImageView *)[scrollView.subviews objectAtIndex:(scrollView.subviews.count-2)]);
    //set color to horizontal indicator
    [horizontalIndicator setBackgroundColor:[UIColor blueColor]];
}

Примечание: - потому что эти индикаторы обновляются каждый раз при прокрутке (означает сброс к значению по умолчанию). Итак, мы помещаем этот код в scrollViewDidScroll метод делегата.

enter image description here Демонстрация доступна на GitHub - https://github.com/ioshacks/UIScrollViewIndicatorColor

Ответ 4

Swift 2.0:

Добавить делегат UIScrollView.

func scrollViewDidScroll(scrollView: UIScrollView){
let verticalIndicator: UIImageView = (scrollView.subviews[(scrollView.subviews.count - 1)] as! UIImageView)
verticalIndicator.backgroundColor = UIColor.greenColor()

let horizontalIndicator: UIImageView = (scrollView.subviews[(scrollView.subviews.count - 2)] as! UIImageView)
horizontalIndicator.backgroundColor = UIColor.blueColor()
}

Ответ 5

Вы можете изменить изображение индикатора, но вы должны сделать это повторно.

func scrollViewDidScroll(_ scrollView: UIScrollView) {
    self.chageScrollIndicator()
}

func chageScrollIndicator (){
    if let indicator = self.collection.subviews.last as? UIImageView {
        let edge = UIEdgeInsets(top: 1.25,
                                left: 0,
                                bottom: 1.25,
                                right: 0)
        indicator.image = UIImage(named: "ScrollIndicator")?.withRenderingMode(.alwaysTemplate).resizableImage(withCapInsets: edge)
        indicator.tintColor = UIConfiguration.textColor
    }
}

Вы можете использовать это изображение 2 в качестве шаблона: Использовать это изображение для @2x Use this image for @3x

Ответ 6

Я написал статью об этом не так давно. К сожалению, цвет этих баров определяется предопределенными изображениями, поэтому, если вы собираетесь менять цвет баров, потребуется дополнительная работа. Взгляните на следующую ссылку, вы обязательно найдете ответ здесь, так как я попытался решить ту же проблему.

http://leonov.co/2011/04/uiscrollviews-scrollbars-customization/

Ответ 7

Попробуйте это, это, безусловно, поможет вам

    for ( UIView *view in scrollBar.subviews ) {

       if (view.tag == 0 && [view isKindOfClass:UIImageView.class])
       {
        UIImageView *imageView      = (UIImageView *)view;
        imageView.backgroundColor   = [UIColor yellowColor];
       }
    }

Объяснение: UIScrollBar представляет собой набор подпрограмм. Здесь индикатор scrollBar (вертикальный/горизонтальный) является одним из подзонов, а UIImageView.So, если мы установили пользовательский цвет в UIImageView, он будет использовать индикатор scrollBar.

Ответ 8

Так изменяется цвет полосы прокрутки:

    //scroll view  
    UIScrollView *scView = [[UIScrollView alloc] init];  
    scView.frame = self.view.bounds; //scroll view occupies full parent views  
    scView.contentSize = CGSizeMake(400, 800);  
    scView.backgroundColor = [UIColor lightGrayColor];  
    scView.indicatorStyle = UIScrollViewIndicatorStyleBlack;  
    scView.showsHorizontalScrollIndicator = NO;  
    scView.showsVerticalScrollIndicator = YES;  
    scView.scrollEnabled = YES;  
    [self.view addSubview: scView];

Ответ 9

Если вы хотите добавить изображение также, вот код для Swift 3

func scrollViewDidScroll(_ scrollView: UIScrollView) {
    let verticalIndicator = scrollView.subviews.last as? UIImageView
    verticalIndicator?.image = UIImage(named: "imageName")
}

Это также работает для UITableView и UICollectionView.

Ответ 10

Недавно я столкнулся с той же проблемой, поэтому решил написать для нее категорию.

https://github.com/stefanceriu/UIScrollView-ScrollerAdditions

[someScrollView setVerticalScrollerTintColor:someColor]; 
[someScrollView setHorizontalScrollerTintColor:someColor];`

Он смешивает его с исходным изображением, поэтому изменяется только цвет. С другой стороны, он также может быть изменен для предоставления пользовательского изображения для использования скроллеров.

Ответ 11

Вот что я сделал в Swift 4, как и предыдущие ответы. В моем случае я повторяю, чтобы изображение было невидимым, установил правильный радиус угла и только выполнил этот процесс один раз.

func scrollViewDidScroll(_ scrollView: UIScrollView) {
    let color = UIColor.red
    guard
        let verticalIndicator = scrollView.subviews.last as? UIImageView,
        verticalIndicator.backgroundColor != color,
        verticalIndicator.image?.renderingMode != .alwaysTemplate
    else { return }
    verticalIndicator.layer.masksToBounds = true
    verticalIndicator.layer.cornerRadius = verticalIndicator.frame.width / 2
    verticalIndicator.backgroundColor = color
    verticalIndicator.image = verticalIndicator.image?.withRenderingMode(.alwaysTemplate)
    verticalIndicator.tintColor = .clear
}

Ответ 12

используйте код ниже на iOS Renderer

 private bool _layouted;
 public override void LayoutSubviews()
 {
       base.LayoutSubviews();
       if (!_layouted)
       {
            this.Layer.BorderColor = UIColor.Red.CGColor;
            var Verticalbar = (UIImageView)this.Subviews[this.Subviews.Length - 1];

            Verticalbar.BackgroundColor = Color.FromHex("#0099ff").ToUIColor();
            var Horizontlebar = (UIImageView)this.Subviews[this.Subviews.Length - 2];

            Horizontlebar.BackgroundColor = Color.FromHex("#0099ff").ToUIColor();
            _layouted = true;
       }
}

Ответ 13

в IOS 13

Попробуйте это

func scrollViewDidScroll(_ scrollView: UIScrollView){


        if #available(iOS 13, *) {
            (scrollView.subviews[(scrollView.subviews.count - 1)].subviews[0]).backgroundColor = UIColor.themeColor(1.0) //verticalIndicator
            (scrollView.subviews[(scrollView.subviews.count - 2)].subviews[0]).backgroundColor = UIColor.themeColor(1.0) //horizontalIndicator
        } else {
            if let verticalIndicator: UIImageView = (scrollView.subviews[(scrollView.subviews.count - 1)] as? UIImageView) {
                verticalIndicator.backgroundColor = UIColor.themeColor(1.0)
            }

            if let horizontalIndicator: UIImageView = (scrollView.subviews[(scrollView.subviews.count - 2)] as? UIImageView) {
                horizontalIndicator.backgroundColor = UIColor.themeColor(1.0)
            }
        }
    }

Ответ 14

в IOS 13

Поскольку индикаторы прокрутки iOS13 имеют класс _UIScrollViewScrollIndicator, а не UIImageView.

Многие люди использовали такой код, как

let verticalIndicator: UIImageView = (scrollView.subviews[(scrollView.subviews.count - 1)] as! UIImageView)

Это не очень хорошая идея, потому что они обещали, что последним подпредставлением будет UIImageView :). Теперь это не так, и они могут потерпеть крах.

Вы можете попробовать следующий код для получения индикаторов scrollView:

extension UIScrollView {

    var scrollIndicators: (horizontal: UIView?, vertical: UIView?) {

        guard self.subviews.count >= 2 else {
            return (horizontal: nil, vertical: nil)
        }

        func viewCanBeScrollIndicator(view: UIView) -> Bool {
            let viewClassName = NSStringFromClass(type(of: view))
            if viewClassName == "_UIScrollViewScrollIndicator" || viewClassName == "UIImageView" {
                return true
            }
            return false
        }

        let horizontalScrollViewIndicatorPosition = self.subviews.count - 2
        let verticalScrollViewIndicatorPosition = self.subviews.count - 1

        var horizontalScrollIndicator: UIView?
        var verticalScrollIndicator: UIView?

        let viewForHorizontalScrollViewIndicator = self.subviews[horizontalScrollViewIndicatorPosition]
        if viewCanBeScrollIndicator(view: viewForHorizontalScrollViewIndicator) {
            horizontalScrollIndicator = viewForHorizontalScrollViewIndicator
        }

        let viewForVerticalScrollViewIndicator = self.subviews[verticalScrollViewIndicatorPosition]
        if viewCanBeScrollIndicator(view: viewForVerticalScrollViewIndicator) {
            verticalScrollIndicator = viewForVerticalScrollViewIndicator
        }
        return (horizontal: horizontalScrollIndicator, vertical: verticalScrollIndicator)
    }

}

Если вам нужен только один (индикатор h или v) - лучше обрезать эту функцию и оставить только один, который вам нужен (для улучшения производительности).

Также было бы хорошо вызвать функцию обновления внутри DispatchQueue, чтобы сохранить плавность прокрутки.

func scrollViewDidScroll(_ scrollView: UIScrollView) {
   DispatchQueue.main.async {
       scrollView.updateCustomScrollIndicatorView()
   }
}

Ответ 15

Вы можете использовать пользовательские полосы прокрутки UIScrollView для реализации цвета в полосах прокрутки. Для более подробной информации смотрите здесь