ios Changing UIScrollView scrollbar color to different colors

后端 未结 17 2351
我在风中等你
我在风中等你 2020-12-05 07:16

How can we change color of UIScrollview\'s scroll indicator to something like blue, green etc.

I know we can change it to white, black. But other then these colors.

17条回答
  •  挽巷
    挽巷 (楼主)
    2020-12-05 07:26

    in IOS 13

    Since iOS13 scroll indicators have class _UIScrollViewScrollIndicator, not UIImageView.

    Many people used code like

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

    It's not good idea, because they promised that last subview will be UIImageView :). Now it's not and they can get crash.

    You can try following code to get scrollView indicators:

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

    If you need only one (h or v indicator) - it's better to cut this func and keep only one you need (to improve perfomance).

    Also it would be good to call update func inside of DispatchQueue, to keep smoothness of scrolling.

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

提交回复
热议问题