ios将UIScrollView滚动条颜色更改为不同颜色

ios将UIScrollView滚动条颜色更改为不同颜色,ios,uiscrollview,Ios,Uiscrollview,如何将UIScrollview滚动指示器的颜色更改为蓝色、绿色等颜色 我知道我们可以把它改成白色,黑色。但是除了这些颜色之外 非常感谢您可以使用自定义UIScrollView滚动条在滚动条中实现颜色。要了解更多详细信息,请查看不幸的是,您不能这样做,当然,您可以自己滚动。以下是您的选择: UIScrollViewIndicatorStyleDefault: //scroll view UIScrollView *scView = [[UIScrollView alloc] i

如何将UIScrollview滚动指示器的颜色更改为蓝色、绿色等颜色

我知道我们可以把它改成白色,黑色。但是除了这些颜色之外


非常感谢

您可以使用自定义UIScrollView滚动条在滚动条中实现颜色。要了解更多详细信息,请查看

不幸的是,您不能这样做,当然,您可以自己滚动。以下是您的选择:

UIScrollViewIndicatorStyleDefault:

    //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];
滚动指示器的默认样式,黑色带白色边框。这种风格适合任何内容背景

UIScrollViewIndicatorStyleBlack:

    //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];
黑色且小于默认样式的指示器样式。此样式在白色内容背景下效果良好

UIScrollViewIndicatorStyleWhite:

    //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];
指示器的样式为白色且小于默认样式。这种风格适合黑色内容背景


不久前我写了一篇关于这方面的文章。不幸的是,这些条的颜色是由预定义的图像定义的,因此,如果要更改条的颜色,则需要进行一些额外的工作。看看下面的链接,你肯定会在这里找到答案,因为我试图解决同样的问题


我最近遇到了同样的问题,所以我决定为它写一个分类


它将其与原始图像混合,因此只有颜色会改变。另一方面,也可以对其进行修改,以提供一个自定义图像供滚动条使用。

试试这个,它肯定会对您有所帮助

    for ( UIView *view in scrollBar.subviews ) {

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

说明:UIScrollBar是子视图的集合。这里的滚动条指示器(垂直/水平)是其中一个子视图,它是UIImageView。因此,如果我们将自定义颜色设置为UIImageView,它会影响滚动条指示器

这是滚动条颜色的更改方式:

    //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];
两个UIScrollView指示器都是UIScrollView的子视图。所以,我们可以 访问UIScrollView的子视图并更改子视图的属性

1.添加UIScrollViewDelegate

@interface ViewController : UIViewController<UIScrollViewDelegate>
@end
注意:-因为每次滚动时这些指示器都会更新 (指重置为默认值)。所以,我们把这段代码放在scrollViewDidScroll中 委托方法


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()
}

您可以更改指示器的图像,但应重复此操作

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图像用作模板:
以下是更安全的Swift 3方法:

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

如果您还想添加图像,下面是Swift 3的代码

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

这也适用于UITableView和UICollectionView。

以下是我在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
}

请在iOS渲染器上使用以下代码

 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;
       }
}

在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)
            }
        }
    }

在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内部调用updatefunc,以保持滚动的平滑性

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

至于iOS 13子视图的更改,所以添加简单的if,解决了这个问题

- (void)scrollViewDidScroll:(UIScrollView *)scrollView {
if ([[[UIDevice currentDevice] systemVersion] floatValue] >= 13.0) {
    UIView *verticalIndicator = [scrollView.subviews lastObject];
    verticalIndicator.backgroundColor = [UIColor redColor];
} else {
    UIImageView *verticalIndicator = [scrollView.subviews lastObject];
    verticalIndicator.backgroundColor = [UIColor redColor];
}
}

根据@Alex()的答案,我发布了一个小小的改进来改变滚动指示器的颜色

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.subviews[0]
        }

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

}
如果不添加
.subviews[0]
,您将获得更深的视图,并且当您尝试更改指示器的颜色时,这将显示一种奇怪的白色效果。这是因为前面有另一个视图:

通过将
.subview[0]
添加到每个指示器视图,一旦您尝试通过调用更改颜色:

override func scrollViewDidScroll(_ scrollView: UIScrollView) {
    DispatchQueue.main.async() {
        scrollView.scrollIndicators.vertical?.backgroundColor = UIColor.yourcolor
    }
}
您将访问第一个视图并正确更改颜色:


感谢@Alex,他发布了一个很棒的解决方案,我在问题中已经说过,我知道我们可以改变这些颜色。无论如何,感谢您的时间这些样式的属性是“indicatorStyle”。我很困惑,如果您说不应该在生产代码中使用该库,那么它的用途是什么?请也对您的答案提供一些解释。UIScrollBar是子视图的集合。这里的滚动条指示器(垂直/水平)是其中一个子视图,它是UIImageView。因此,如果我们将自定义颜色设置为UIImageView,它会影响滚动条指示器。请改进您发布的。可能是!!不是100%肯定。但有什么不对呢?我们在不违反任何设计准则的情况下,将内容放入滚动视图指示器中……没有任何错误。我只是想知道这是否不会给我在提交时带来问题。不会的。但是它很有黑客性,所以我建议将scrollview子类化并编写自己的跟踪指示符View谁能保证scrollview.subviews.count-1和scrollview.subviews.count-2是这些指示符的正确索引?@PaulBrewczynski,因为scroll指示符是在运行时作为子视图添加的,意思是当一些滚动滚动视图,然后滚动视图添加这两个滚动指示器作为子视图。。。所以当用户滚动时,滚动指示器在最后一个和第二个最后一个索引始终可用。我们可以使滚动指示器高度恒定吗??添加到代码中,解释为什么这解决了问题提出的问题总是好的。最好编辑这篇文章,包括详细的描述。不起作用。scrollview的子视图数组为空:(打开“显示水平指示器”或/和“显示垂直指示器”?@SerjRubenst已打开@Alexand scrollview的子视图数组为空。)