Как мы можем изменить цвет индикатора прокрутки UIScrollview на что-то вроде синего, зеленого и т.д.
Я знаю, что мы можем изменить его на белый, черный. Но другие тогда эти цвета.
Большое спасибо
Как мы можем изменить цвет индикатора прокрутки UIScrollview на что-то вроде синего, зеленого и т.д.
Я знаю, что мы можем изменить его на белый, черный. Но другие тогда эти цвета.
Большое спасибо
К сожалению, вы не можете, конечно, вы всегда можете сворачивать свои собственные. Это ваши варианты:
UIScrollViewIndicatorStyleDefault:
По умолчанию используется индикатор прокрутки, черный с белой рамкой. Этот стиль хорош для любого контента.
UIScrollViewIndicatorStyleBlack:
Стиль индикатора черного цвета и меньше, чем стиль по умолчанию. Этот стиль хорош на фоне белого контента.
UIScrollViewIndicatorStyleWhite:
Стиль индикатора белый и меньше, чем стиль по умолчанию. Этот стиль хорош на фоне черного контента.
Здесь более безопасный Swift 3 метод:
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/ioshacks/UIScrollViewIndicatorColor
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 в качестве шаблона:
Я написал статью об этом не так давно. К сожалению, цвет этих баров определяется предопределенными изображениями, поэтому, если вы собираетесь менять цвет баров, потребуется дополнительная работа. Взгляните на следующую ссылку, вы обязательно найдете ответ здесь, так как я попытался решить ту же проблему.
http://leonov.co/2011/04/uiscrollviews-scrollbars-customization/
Попробуйте это, это, безусловно, поможет вам
for ( UIView *view in scrollBar.subviews ) {
if (view.tag == 0 && [view isKindOfClass:UIImageView.class])
{
UIImageView *imageView = (UIImageView *)view;
imageView.backgroundColor = [UIColor yellowColor];
}
}
Объяснение: UIScrollBar представляет собой набор подпрограмм. Здесь индикатор scrollBar (вертикальный/горизонтальный) является одним из подзонов, а UIImageView.So, если мы установили пользовательский цвет в UIImageView, он будет использовать индикатор scrollBar.
Так изменяется цвет полосы прокрутки:
//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];
Если вы хотите добавить изображение также, вот код для Swift 3
func scrollViewDidScroll(_ scrollView: UIScrollView) {
let verticalIndicator = scrollView.subviews.last as? UIImageView
verticalIndicator?.image = UIImage(named: "imageName")
}
Это также работает для UITableView и UICollectionView.
Недавно я столкнулся с той же проблемой, поэтому решил написать для нее категорию.
https://github.com/stefanceriu/UIScrollView-ScrollerAdditions
[someScrollView setVerticalScrollerTintColor:someColor];
[someScrollView setHorizontalScrollerTintColor:someColor];`
Он смешивает его с исходным изображением, поэтому изменяется только цвет. С другой стороны, он также может быть изменен для предоставления пользовательского изображения для использования скроллеров.
Вот что я сделал в 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 Renderer
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, чтобы сохранить плавность прокрутки.
func scrollViewDidScroll(_ scrollView: UIScrollView) {
DispatchQueue.main.async {
scrollView.updateCustomScrollIndicatorView()
}
}
Вы можете использовать пользовательские полосы прокрутки UIScrollView для реализации цвета в полосах прокрутки. Для более подробной информации смотрите здесь