UIScrollviewのスクロールインジケーターの色を青、緑などに変更するにはどうすればよいですか。
白、黒に変更できることはわかっています。しかし、それ以外はこれらの色。
どうもありがとう
UIScrollviewのスクロールインジケーターの色を青、緑などに変更するにはどうすればよいですか。
白、黒に変更できることはわかっています。しかし、それ以外はこれらの色。
どうもありがとう
残念ながら、あなたはできません、もちろん、あなたはいつでもあなた自身を転がすことができます。これらはあなたのオプションです:
UIScrollViewIndicatorStyleDefault:
スクロールインジケーターのデフォルトのスタイル。黒と白の境界線です。このスタイルは、コンテンツの背景に適しています。
UIScrollViewIndicatorStyleBlack:
黒でデフォルトのスタイルよりも小さいインジケーターのスタイル。このスタイルは、白いコンテンツの背景に適しています。
UIScrollViewIndicatorStyleWhite:
インジケーターのスタイルは白で、デフォルトのスタイルよりも小さくなっています。このスタイルは、黒いコンテンツの背景に適しています。
より安全なSwift3の方法は次のとおりです。
func scrollViewDidScroll(_ scrollView: UIScrollView) {
let verticalIndicator = scrollView.subviews.last as? UIImageView
verticalIndicator?.backgroundColor = UIColor.green
}
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
@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に敬意を表します
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)
}
}
}
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()
}
これを試してみてくださいそれは確かにあなたを助けるでしょう
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インジケーターが有効になります。
インジケーターの画像を変更することはできますが、これを繰り返し行う必要があります
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
}
}
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()
}
}
スクロールバーの色は次のように変更されます。
//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];
画像も追加したい場合は、Swift3のコードを次に示します。
func scrollViewDidScroll(_ scrollView: UIScrollView) {
let verticalIndicator = scrollView.subviews.last as? UIImageView
verticalIndicator?.image = UIImage(named: "imageName")
}
これは、UITableViewおよびUICollectionViewでも機能します。
私はこれについて少し前に記事を書きました。残念ながら、このバーの色は事前定義された画像によって定義されているため、バーの色を変更する場合は、追加の作業が必要になります。次のリンクを見てください。私が同じ問題を解決しようとしたので、ここで間違いなく答えが見つかります。
http://leonov.co/2011/04/uiscrollviews-scrollbars-customization/
最近同じ問題に遭遇したので、そのカテゴリを作成することにしました。
https://github.com/stefanceriu/UIScrollView-ScrollerAdditions
[someScrollView setVerticalScrollerTintColor:someColor];
[someScrollView setHorizontalScrollerTintColor:someColor];`
元の画像とブレンドされるため、色のみが変更されます。一方、スクローラーが使用するカスタムイメージを提供するように変更することもできます。
これが、以前の回答と同様に、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
}
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のサブビューが変更されたため、単純な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];
}
}
カスタムUIScrollViewスクロールバーを使用して、スクロールバーに色を実装できます。詳細については、こちらをご覧ください