使用 NavigationBar 禁用 UIScrollView 垂直滚动

Posted

技术标签:

【中文标题】使用 NavigationBar 禁用 UIScrollView 垂直滚动【英文标题】:Disable UIScrollView vertical scrolling with NavigationBar 【发布时间】:2012-11-01 18:09:11 【问题描述】:

所以我看过很多其他关于此的帖子,我想我几乎都试过了。我不希望这是重复的,但我无法解决我的问题。我有这样的设置:

当我到达我的滚动视图控制器时,我可以很好地翻页,但我也可以垂直移动图片。我认为这与 NavigationBar 强制向下滚动 ScrollView 框架有关,但仍将框架设置为全屏大小。如何防止滚动视图视图控制器上的任何垂直滚动?我的 .m 如下:

- (void)viewDidLoad

[super viewDidLoad];
// Do any additional setup after loading the view.
self.navigationController.navigationBarHidden = NO;

i = 0;

_PhotoBundle = [[NSBundle mainBundle] pathsForResourcesOfType:@".jpg"inDirectory:@"Dog_Images"];

_PhotoArray = [[NSMutableArray alloc] initWithCapacity:_PhotoBundle.count];
for (NSString* path in _PhotoBundle)

    [_PhotoArray addObject:[UIImage imageWithContentsOfFile:path]];

for (int x = 0; x < _PhotoArray.count; x++)

    CGRect frame;
    frame.origin.x = self.mainScroll.frame.size.width * x;
    frame.origin.y = 0;
    frame.size = self.mainScroll.frame.size;

    UIImage *nextImg = [[UIImage alloc] init];
    nextImg = [_PhotoArray objectAtIndex:x];

    UIImageView *nextIV = [[UIImageView alloc] initWithFrame:frame];
    [nextIV setImage:nextImg];

    [self.mainScroll addSubview:nextIV];
    //NSLog(@"Pass %d", x);


self.mainScroll.contentSize = CGSizeMake(self.mainScroll.frame.size.width * _PhotoArray.count, self.mainScroll.frame.size.height);


非常感谢!!

【问题讨论】:

viewDidAppear 中NSLog(@"self.mainScroll.frame:(%f,%f,%f,%f)", self.mainScroll.frame.origin.x, self.mainScroll.frame.origin.y, self.mainScroll.size.height, self.mainScroll.size.width); 的输出是什么?这是您所期望的,还是有所不同? ScrollTest[361:c07] self.mainScroll.frame:(0.000000,20.000000,460.000000,320.000000) 那是在我将 contentSize 更改为 1.0 之前 有趣的是,当我在替换 1.0 时这样做是一样的:ScrollTest[418:c07] self.mainScroll.frame:(0.000000,20.000000,460.000000,320.000000) 有趣...这似乎是机器中的幽灵。很高兴你知道了! 【参考方案1】:

于是我找到了一篇解释得很完美的帖子:

How to disable just vertical scrolling in a UIScrollView?

当我改变我的

CGSizeMake(self.mainScroll.frame.size.width * _PhotoArray.count, self.mainScroll.frame.size.height);

CGSizeMake(self.mainScroll.frame.size.width * _PhotoArray.count, 1.0);

它使 contentSize 大于界限......我读过的东西,但没有完全理解。我希望这可以帮助其他陷入困境的人......

【讨论】:

【参考方案2】:

UIScrollView 仅当 -contentSize 设置为大于其框架时才会滚动其内容。因此,当您设置 self.mainScroll.contentSize 时,它的 contentSize.height 比它的框架还要多。

在使用它的类之前至少尝试阅读 Apple 的文档。这很无聊。但是薪水可以弥补所有无聊的东西。

顺便说一句。您错误地使用 UIScrollView 来显示 UIImageView 对象。尝试观看 Apple WWDC 会话(可以从 iTunes 下载) - 关于如何仅使用三个 UIImageView 对象来绘制无尽的 UIScrollView 分页,有两到三个会话

Apple's documentation on UIScrollView

【讨论】:

感谢您的回答。我已经阅读了很多苹果的资料,我正在 iTunes 中寻找 WWDC 的资料(到目前为止还没有出现)。我知道 constentSize.height,这就是为什么我认为它可能与 NavigationBar 相关联。 我在 iTunes 上找不到 WWDC 的内容。你有我可以搜索的特定标题吗?再次感谢。 您还有其他想法吗?我没有发现这个答案很有帮助,因为我已经阅读了大部分文档并且在 iTunes 上找不到 WWDC 的东西。谢谢 嗯,这是 2011 年 WWDC 会议的链接:developer.apple.com/videos/wwdc/2011,您还应该寻找“高级滚动查看技术”视频会议。此外,您必须购买苹果开发者计划才能访问 Apple WWDC 会议。并且在 2011 年 WWDC 之前有一个会议 - developer.apple.com/videos/wwdc/2010(查找标题“使用滚动视图设计应用程序”) 在看了示例代码和视频之后,他们基本上在做同样的事情。他们仍然为每个图像创建图像视图,只是在分层方面做得更好。虽然他们也没有使用情节提要,所以我需要学习如何翻译并将其链接到情节提要中。感谢您的指导。

以上是关于使用 NavigationBar 禁用 UIScrollView 垂直滚动的主要内容,如果未能解决你的问题,请参考以下文章

禁用同时 rightBarButton / tapGestureRecognizer 触摸

嵌套的 UITableViews:一种只滚动外部 UITableView,同时禁用内部的方法?

如何禁用多个按钮?

禁用重新排列标签 iphone

防止uiscrollview向右滚动

触摸时禁用其他栏按钮项:导航栏