Подтвердить что ты не робот

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

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

[myscrollView flashScrollIndicators];

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

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

4b9b3361

Ответ 1

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

Индикаторы прокрутки любых просмотров содержимого представляют собой UIImageView подвыборы этих представлений контента. Это означает, что вы можете получить доступ к индикаторам прокрутки 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 он будет устанавливать свой собственный атрибут альфа-характеристики прокрутки в 0, чтобы скрыть его. На этом этапе он будет проходить через нашу категорию, и если хостинг UIScrollView имеет правильный тег, он будет игнорировать заданное значение, оставив его отображаемым.

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

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

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

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

Ответ 2

Я хочу предложить свое решение. Мне не нравится самый популярный вариант с категорией (переопределяющие методы в категории могут быть причиной некоторой неопределенности, какой метод следует вызывать во время выполнения, так как существует два метода с одним и тем же селектором). Вместо этого я использую 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

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

Ответ 3

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

Полоса прокрутки внутри Scrollview представляет собой изображение. Что является подзадачей UIScrollview

Итак, получите изображение прокрутки в окне просмотра пользовательского интерфейса. Затем попробуйте установить скрытое свойство изображения в значение NO или изменить значение Alpha

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

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