UIScrollView - 显示滚动条
Posted
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了UIScrollView - 显示滚动条相关的知识,希望对你有一定的参考价值。
可能是一个简单的!
有谁知道如何让UIScrollView的滚动条不断显示?
它在用户滚动时显示,因此他们可以看到它们所在的滚动视图的位置。
但是我希望它能够不断显示,因为用户不会立即明白滚动是否可用
任何建议都将受到高度赞赏。
不,你不能让它们总是显示,但你可以让它们暂时闪现。
[myScrollView flashScrollIndicators];
它们是滚动指示器,而不是滚动条。您无法使用它们滚动。
my solution一直用于显示滚动指示器
#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位的一些问题。有关更多细节,请查看here
据我所知,这是不可能的。控制显示滚动指示器的唯一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
循环并删除另一个。
对于webview,其中第一个子视图是滚动视图,在最新的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
ScrollBar的功能就像iOS内置的一样,但你可以搞乱颜色和宽度。
-(void)persistantScrollBar
{
[persistantScrollBar removeFromSuperview];
[self.collectionView setNeedsLayout];
[self.collectionView layoutIfNeeded];
if (self.collectionView.contentSize.height &g以上是关于UIScrollView - 显示滚动条的主要内容,如果未能解决你的问题,请参考以下文章
如何永久显示 UIScrollView 滚动条而不仅仅是闪烁?