UIScrollView-отображение полосы прокрутки


возможно просто!

кто-нибудь знает, как заставить полосу прокрутки UIScrollView постоянно отображаться?

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

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

любые советы будут высоко оценены.

9 53

9 ответов:

нет, вы не можете сделать их всегда показывать, но вы можете сделать их временно мигать.

[myScrollView flashScrollIndicators];

это индикаторы прокрутки, а не полосы прокрутки. Вы не можете использовать их для прокрутки.

мое решение для отображения индикаторов прокрутки все время

#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

обновление: это решение вызывает некоторые проблемы на 64-разрядной версии. Для получения более подробной информации смотрите здесь

насколько я знаю, это невозможно. Единственный вызов API, который управляет отображением индикатора прокрутки, -showsVerticalScrollIndicator и это может только отключить отображение индикатора в целом.

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

Это один работал для меня:

#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

Я получил этот фрагмент отсюда: http://www.developers-life.com/scrollview-with-scrolls-indicators-which-are-shown-all-the-time.html

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

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

- (void)viewDidAppear:(BOOL)animated {
    [super viewDidAppear:animated];
    // Do swizzling to turn scroll indicator always on
    // Search correct subview with vertical 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;
                    }
                }
            }
        }
    }
    // Search correct subview with horizontal scroll indicator image across tableView subviews
    for (UIView * view in self.categoriesTableView.subviews) {
        if ([view isKindOfClass:[UIImageView class]]) {
            if (view.alpha == 0 && view.autoresizingMask == UIViewAutoresizingFlexibleTopMargin) {
                if (view.frame.size.height < 10 && view.frame.size.height < view.frame.size.width) {
                    if (self.categoriesTableView.frame.size.width < self.categoriesTableView.contentSize.width) {
                        // 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

индикатор прокрутки (вертикальный индикатор прокрутки в первом for цикл и горизонталь в секунду for цикл) всегда будет на экране. Если вам нужен только один индикатор, оставьте только этот for цикл в коде и удалить еще один.

для webviews, где первым подвидом является scrollview, в последнем SDK, если HTML-страница длиннее кадра, полоса прокрутки не отображается, и если содержимое html оказывается в одной строке с кадром, или у вас есть пробел в нижней части кадра, это "выглядит" так, как будто нет необходимости в прокрутке и ничего ниже строки. В этом случае, я думаю, вы должны определенно мигать полосы прокрутки в делегате

- (void)webViewDidFinishLoad:(UIWebView *)webView; 

способ, чтобы предупредить пользователя, что есть больше вещей 'вне коробки'.

NSArray *subViews = [[NSArray alloc] initWithArray:[webView subviews]] ;
UIScrollView *webScroller = (UIScrollView *)[subViews objectAtIndex:0] ;    

С HTML, горизонтальное содержание обернуто автоматически, поэтому проверите высоту webscroller.

        if (webScroller.contentSize.height > webView.frame.size.height) {
            [webScroller flashScrollIndicators];
        }

вспышка настолько коротка, и происходит во время загрузки над видами, что ее можно не заметить. Чтобы обойти это, вы также можете покачивать или подпрыгивать или прокручивать или масштабировать содержимое немного через общие UIView commitAnimations

iOS не предлагает API. Но если вы действительно хотите этого, вы можете добавить свой пользовательский индикатор для прокрутки и макета его самостоятельно, так же, как это делает демо:

- (void)layoutSubviews
{
    [super layoutSubviews];

    if (self.showsVerticalScrollIndicatorAlways) {
        scroll_indicator_position(self, k_scroll_indicator_vertical);
    }

    if (self.showsHorizontalScrollIndicatorAlways) {
        scroll_indicator_position(self, k_scroll_indicator_horizontal);
    }
}

Ссылка https://github.com/flexih/MazeScrollView

полоса прокрутки, которая работает так же, как iOS, встроенная в один, но вы можете возиться с цветом и шириной.

-(void)persistantScrollBar
{
    [persistantScrollBar removeFromSuperview];
    [self.collectionView setNeedsLayout];
    [self.collectionView layoutIfNeeded];

    if (self.collectionView.contentSize.height > self.collectionView.frame.size.height + 10)
    {
        persistantScrollBar = [[UIView alloc] initWithFrame:(CGRectMake(self.view.frame.size.width - 10, self.collectionView.frame.origin.y, 5, (self.collectionView.frame.size.height /self.collectionView.contentSize.height) * self.collectionView.frame.size.height))];
        persistantScrollBar.backgroundColor = [UIColor colorWithRed:207/255.f green:207/255.f blue:207/255.f alpha:0.5f];
        persistantScrollBar.layer.cornerRadius = persistantScrollBar.frame.size.width/2;
        persistantScrollBar.layer.zPosition = 0;
        [self.view addSubview:persistantScrollBar];
    }
}

-(void)scrollViewDidScroll:(UIScrollView *)scrollView
{
    CGRect rect = persistantScrollBar.frame;
    rect.origin.y =  scrollView.frame.origin.y + (scrollView.contentOffset.y *(self.collectionView.frame.size.height/self.collectionView.contentSize.height));
    rect.size.height = (self.collectionView.frame.size.height /self.collectionView.contentSize.height) * self.collectionView.frame.size.height;
    if ( scrollView.contentOffset.y <= 0 )
    {
        rect.origin.y = scrollView.frame.origin.y;
        rect.size.height = rect.size.height + (scrollView.contentOffset.y);
    }
    else if (scrollView.contentOffset.y + scrollView.frame.size.height >= scrollView.contentSize.height)
    {
        rect.size.height = rect.size.height - ((scrollView.contentOffset.y + scrollView.frame.size.height) - scrollView.contentSize.height);
        rect.origin.y =  (self.collectionView.frame.origin.y + self.collectionView.frame.size.height - 5) - rect.size.height;
    }

    persistantScrollBar.frame = rect;
}

Swift 3

вы можете получить доступ к полосе прокрутки с помощью scrollView.subviews и изменить альфа, как показано здесь. Это работает на меня.

extension UIScrollView {
    override open func touchesEnded(_ touches: Set<UITouch>, with event: UIEvent?) {
        for x in self.subviews {
            x.alpha = 1.0
        }
    }
}

extension MyScrollViewDelegate : UIScrollViewDelegate {
    func scrollViewDidEndDecelerating(_ scrollView: UIScrollView) {
        for x in scrollView.subviews {
            x.alpha = 1.0
        }
    }
}