Сделать полосу прокрутки всегда видимой в UIScrollView?

Мне нужно сделать полосу прокрутки всегда видимой на viewDidLoad, чтобы пользователь мог понять, что есть содержимое для прокрутки. Я сделал следующее:--2-->

[myscrollView flashScrollIndicators];

но затем полосы прокрутки появляются только в течение некоторого времени после viewDidLoad и исчезают снова только для того, чтобы появиться, когда пользователь коснется экрана..

Мне нужно сделать полосы прокрутки всегда видны. Как я могу это сделать?

3 ответов


Apple косвенно препятствовать постоянно отображать индикаторы прокрутки в их iOS руководство по человеческому интерфейсу но рекомендации-это просто рекомендации по какой-то причине, они не учитывают каждый сценарий, и иногда вам может потребоваться вежливо игнорировать их.

индикаторы прокрутки любых представлений контента являются UIImageView подвиды этих представлений содержимого. Это означает, что вы можете открыть индикаторы прокрутки a UIScrollView как и любой другой подвиды (т. е. myScrollView.subviews) и изменить индикаторы прокрутки, как вы бы любой UIImageView (например,scrollIndicatorImageView.backgroundColor = [UIColor redColor];).

наиболее популярным решением, по-видимому, является следующий код:

#define noDisableVerticalScrollTag 836913
#define noDisableHorizontalScrollTag 836914

@implementation UIImageView (ForScrollView) 

- (void) setAlpha:(float)alpha {

    if (self.superview.tag == noDisableVerticalScrollTag) {
        if (alpha == 0 && self.autoresizingMask == UIViewAutoresizingFlexibleLeftMargin) {
            if (self.frame.size.width < 10 && self.frame.size.height > self.frame.size.width) {
                UIScrollView *sc = (UIScrollView*)self.superview;
                if (sc.frame.size.height < sc.contentSize.height) {
                    return;
                }
            }
        }
    }

    if (self.superview.tag == noDisableHorizontalScrollTag) {
        if (alpha == 0 && self.autoresizingMask == UIViewAutoresizingFlexibleTopMargin) {
            if (self.frame.size.height < 10 && self.frame.size.height < self.frame.size.width) {
                UIScrollView *sc = (UIScrollView*)self.superview;
                if (sc.frame.size.width < sc.contentSize.width) {
                    return;
                }
            }
        }
    }

    [super setAlpha:alpha];
}

@end

который первоначально приписывается этот источник.

это определяет категорию UIImageView это определяет пользовательский сеттер для свойства alpha. Это работает, потому что в какой-то момент в код UIScrollView, он установит свой свиток свойство alpha индикатора равно 0, чтобы скрыть его. На данный момент он будет работать через нашу категорию и, если хостинг UIScrollView имеет правый тег, он будет игнорировать установленное значение, оставляя его отображаемым.

чтобы использовать это решение, убедитесь, что ваш UIScrollView есть соответствующий тег, например Tag

если вы хотите, чтобы отобразить индикатор прокрутки с момента его UIScrollView виден просто мигают индикаторы прокрутки, когда появляется вид .е.г

- (void)viewDidAppear:(BOOL)animate
{
    [super viewDidAppear:animate];
    [self.scrollView flashScrollIndicators];
}

Дополнительные ссылки SO:


Я хочу предложить свое решение. Мне не нравится самый популярный вариант с категорией (переопределение методов в категории может быть причиной некоторой неопределенности, какой метод следует вызывать во время выполнения, так как есть два метода с одним и тем же селектором). Вместо этого я использую swizzling. И еще мне не нужно использовать теги.

добавьте этот метод в контроллер вида, где у вас есть вид прокрутки (self.categoriesTableView в моем случае)

- (void)viewDidAppear:(BOOL)animated {
    [super viewDidAppear:animated];
    // Do swizzling to turn scroll indicator always on
    // Search correct subview with scroll indicator image across tableView subviews
    for (UIView * view in self.categoriesTableView.subviews) {
        if ([view isKindOfClass:[UIImageView class]]) {
            if (view.alpha == 0 && view.autoresizingMask == UIViewAutoresizingFlexibleLeftMargin) {
                if (view.frame.size.width < 10 && view.frame.size.height > view.frame.size.width) {
                    if (self.categoriesTableView.frame.size.height < self.categoriesTableView.contentSize.height) {
                        // Swizzle class for found imageView, that should be scroll indicator
                        object_setClass(view, [AlwaysOpaqueImageView class]);
                        break;
                    }
                }
            }
        }
    }
    // Ask to flash indicator to turn it on
   [self.categoriesTableView flashScrollIndicators];
}

Добавить новый класс

@interface AlwaysOpaqueImageView : UIImageView
@end

@implementation AlwaysOpaqueImageView

- (void)setAlpha:(CGFloat)alpha {
    [super setAlpha:1.0];
}

@end

В индикатор прокрутки (вертикальный индикатор прокрутки в этом случае) всегда будет на экране.


Я не знаю, будет ли это работать или нет. Но только намек для тебя.

полоса прокрутки внутри Scrollview является Imageview. Который является подвидом UIScrollview

итак, получите изображение полосы прокрутки UIscrollview. Затем попробуйте установить, что свойство изображения скрыто нет или изменить Альфа-значение

static const int UIScrollViewHorizontalBarIndexOffset = 0;
static const int UIScrollViewVerticalBarIndexOffset = 1;
-(UIImageView *)scrollbarImageViewWithIndex:(int)indexOffset 
{
    int viewsCount = [[yourScrollview subviews] count];
    UIImageView *scrollBar = [[yourScrollview subviews] objectAtIndex:viewsCount - indexOffset - 1];
    return scrollBar;
}

-(void) viewDidLoad
{
    //Some Code
    //Get Scrollbar
    UIImageView *scrollBar = [self scrollbarImageViewWithIndex: UIScrollViewVerticalBarIndexOffset];

    //The try setting hidden property/ alpha value
    scrollBar.hidden=NO;
}

получил ссылку от здесь