33

UIScrollviewのスクロールインジケーターの色を青、緑などに変更するにはどうすればよいですか。

白、黒に変更できることはわかっています。しかし、それ以外はこれらの色。

どうもありがとう

4

17 に答える 17

37

残念ながら、あなたはできません、もちろん、あなたはいつでもあなた自身を転がすことができます。これらはあなたのオプションです:

UIScrollViewIndicatorStyleDefault:

スクロールインジケーターのデフォルトのスタイル。黒と白の境界線です。このスタイルは、コンテンツの背景に適しています。

UIScrollViewIndicatorStyleBlack:

黒でデフォルトのスタイルよりも小さいインジケーターのスタイル。このスタイルは、白いコンテンツの背景に適しています。

UIScrollViewIndicatorStyleWhite:

インジケーターのスタイルは白で、デフォルトのスタイルよりも小さくなっています。このスタイルは、黒いコンテンツの背景に適しています。

于 2012-08-17T11:56:33.283 に答える
18

より安全なSwift3の方法は次のとおりです。

func scrollViewDidScroll(_ scrollView: UIScrollView) {
    let verticalIndicator = scrollView.subviews.last as? UIImageView
    verticalIndicator?.backgroundColor = UIColor.green
}
于 2016-10-18T09:20:38.120 に答える
11

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デリゲートメソッドに配置します。

ここに画像の説明を入力してください GitHubで利用可能なデモ-https://github.com/developerinsider/UIScrollViewIndicatorColor

于 2015-02-25T11:45:31.623 に答える
9

@Alex(https://stackoverflow.com/a/58415249/3876285)の回答に基づいて、スクロールインジケーターの色を変更するための少しの改善を投稿しています。

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]と、より深いビューが得られ、インジケーターの色を変更しようとすると、奇妙な白い効果で表示されます。それは、その前に別のビューがあるためです。

ここに画像の説明を入力してください

.subviews[0]各インジケータービューに追加することにより、次のように呼び出して色を変更しようとすると、次のようになります。

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

最初のビューにアクセスして、色を適切に変更します。

ここに画像の説明を入力してください

素晴らしいソリューションを投稿してくれた@Alexに敬意を表します

于 2020-04-22T15:17:14.957 に答える
8

IOS13

これを試してみてください

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)
            }
        }
    }
于 2019-10-14T12:24:52.927 に答える
3

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()
}
于 2016-02-08T10:37:03.133 に答える
2

これを試してみてくださいそれは確かにあなたを助けるでしょう

    for ( UIView *view in scrollBar.subviews ) {

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

説明:UIScrollBarはサブビューのコレクションです。ここでは、scrollBarインジケーター(垂直/水平)がサブビューの1つであり、UIImageViewです。したがって、カスタムカラーをUIImageViewに設定すると、scrollBarインジケーターが有効になります。

于 2014-05-17T10:55:24.020 に答える
2

インジケーターの画像を変更することはできますが、これを繰り返し行う必要があります

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に使用します この画像を@3xに使用します

于 2016-09-18T07:35:18.463 に答える
2

IOS13

iOS13のスクロールインジケーターには、UIImageViewではなく_UIScrollViewScrollIndicatorクラスがあるため。

多くの人が次のようなコードを使用しました

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

}

1つだけ(hまたはvインジケーター)が必要な場合は、この関数をカットして、必要なものを1つだけ保持することをお勧めします(パフォーマンスを向上させるため)。

また、スクロールのスムーズさを維持するために、DispatchQueue内でupdatefuncを呼び出すとよいでしょう。

func scrollViewDidScroll(_ scrollView: UIScrollView) {
   DispatchQueue.main.async {
       scrollView.updateCustomScrollIndicatorView()
   }
}
于 2019-10-16T14:03:35.100 に答える
1

スクロールバーの色は次のように変更されます。

    //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];
于 2014-09-02T10:48:22.013 に答える
1

画像も追加したい場合は、Swift3のコードを次に示します。

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

これは、UITableViewおよびUICollectionViewでも機能します。

于 2017-05-09T14:28:22.800 に答える
0

私はこれについて少し前に記事を書きました。残念ながら、このバーの色は事前定義された画像によって定義されているため、バーの色を変更する場合は、追加の作業が必要になります。次のリンクを見てください。私が同じ問題を解決しようとしたので、ここで間違いなく答えが見つかります。

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

于 2012-09-17T01:46:48.037 に答える
0

最近同じ問題に遭遇したので、そのカテゴリを作成することにしました。

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

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

元の画像とブレンドされるため、色のみが変更されます。一方、スクローラーが使用するカスタムイメージを提供するように変更することもできます。

于 2013-06-15T10:16:46.767 に答える
0

これが、以前の回答と同様に、Swift4で行ったことです。私の場合、画像の色を変更して非表示にし、正しい角の半径を設定して、このプロセスを1回だけ実行します。

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
}
于 2017-10-31T10:38:19.410 に答える
0

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;
       }
}
于 2018-01-10T06:10:41.420 に答える
0

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];
}
}
于 2019-10-28T05:48:08.897 に答える
-2

カスタムUIScrollViewスクロールバーを使用して、スクロールバーに色を実装できます。詳細については、こちらをご覧ください

于 2012-08-17T11:55:21.287 に答える