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

UIScrollView - показывает полосу прокрутки

Возможно, простой!

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

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

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

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

4b9b3361

Ответ 1

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

[myScrollView flashScrollIndicators];

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

Ответ 2

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

#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-разрядной версии. Подробнее см. здесь

Ответ 3

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

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

Ответ 4

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

#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

Ответ 5

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

Добавьте этот метод в свой контроллер представления, где у вас есть представление прокрутки (свойство 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 и удалите другой.

Ответ 6

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

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

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

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

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

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

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

Ответ 7

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

Ответ 8

ScrollBar, который работает так же, как и 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;
}

Ответ 9

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

Ответ 10

Свифт 3+

1) Таймер

var timerForShowScrollIndicator: Timer?

2) Методы

/// Show always scroll indicator in table view
func showScrollIndicatorsInContacts() {
    UIView.animate(withDuration: 0.001) {
        self.tableView.flashScrollIndicators()
    }
}

/// Start timer for always show scroll indicator in table view
func startTimerForShowScrollIndicator() {
    self.timerForShowScrollIndicator = Timer.scheduledTimer(timeInterval: 0.3, target: self, selector: #selector(self.showScrollIndicatorsInContacts), userInfo: nil, repeats: true)
}

/// Stop timer for always show scroll indicator in table view
func stopTimerForShowScrollIndicator() {
    self.timerForShowScrollIndicator?.invalidate()
    self.timerForShowScrollIndicator = nil
}

3) Используйте

startTimerForShowScrollIndicator в viewDidAppear

stopTimerForShowScrollIndicator в viewDidDisappear