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

Man*_*ann 26 uiscrollview ios

我们如何将UIScrollview的滚动指示器的颜色更改为蓝色,绿色等.

我知道我们可以把它变成白色,黑色.但其他那些颜色.

非常感谢

Kaa*_*glu 32

不幸的是你不能,当然你可以随时自己动手.这些是你的选择:

UIScrollViewIndicatorStyleDefault:

滚动指示器的默认样式,黑色,带有白色边框.这种风格适用于任何内容背景.

UIScrollViewIndicatorStyleBlack:

一种黑色且小于默认样式的指示器样式.这种风格对白色内容背景很好.

UIScrollViewIndicatorStyleWhite:

指示器样式为白色且小于默认样式.这种风格对黑色内容背景很好.

  • 这些样式的属性是"indicatorStyle" (8认同)

And*_*eev 16

这里有更安全的Swift 3方法:

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


Vin*_*ary 10

UIScrollView指标都是UIScrollView的子视图.因此,我们可以访问UIScrollView的子视图并更改子视图的属性.

1.添加UIScrollViewDelegate

@interface ViewController : UIViewController<UIScrollViewDelegate>
@end
Run Code Online (Sandbox Code Playgroud)

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]];
}
Run Code Online (Sandbox Code Playgroud)

注意: - 因为每次滚动时这些指示器都会更新(意味着重置为默认值).所以,我们将此代码放在scrollViewDidScroll委托方法中.

在此输入图像描述 GitHub上提供的演示 - https://github.com/ioshacks/UIScrollViewIndicatorColor


j_g*_*fer 7

根据@Alex ( /sf/answers/4089067461/ )的回答,我发布了一些改进来更改滚动指示器的颜色。

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

}
Run Code Online (Sandbox Code Playgroud)

如果您不添加.subviews[0],您将获得更深入的视图,并且当您尝试更改指示器的颜色时,它会出现奇怪的白色效果。那是因为前面还有一个视图:

在此处输入图片说明

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

override func scrollViewDidScroll(_ scrollView: UIScrollView) {
    DispatchQueue.main.async() {
        scrollView.scrollIndicators.vertical?.backgroundColor = UIColor.yourcolor
    }
}
Run Code Online (Sandbox Code Playgroud)

您将访问第一个视图并正确更改颜色:

在此处输入图片说明

感谢@Alex 发布了一个很好的解决方案


Jay*_*dip 6

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)
            }
        }
    }
Run Code Online (Sandbox Code Playgroud)