我有像iPhone的Springboard一样的UIView
。我使用UIScrollView
和UIButtons
创建了它。我想禁用所述scrollview上的水平滚动。我只想垂直滚动。我该如何做到这一点?
答案 0 :(得分:119)
您必须设置contentSize
的{{1}}属性。例如,如果您的UIScrollView
宽度为320像素(屏幕宽度),那么您可以这样做:
UIScrollView
CGSize scrollableSize = CGSizeMake(320, myScrollableHeight);
[myScrollView setContentSize:scrollableSize];
只会垂直滚动,因为它已经可以水平显示所有内容。
答案 1 :(得分:84)
更新:(在@EranMarom指出他的评论后)
您可以在ScrollViewDelegate
方法中停止水平滚动或垂直滚动。
这是怎么回事,
停止水平滚动:
如果要水平滚动,则需要增加contentOffset.x。防止停止滚动视图在水平方向滚动。
- (void)scrollViewDidScroll:(UIScrollView *)sender {
sender.contentOffset.x = 0.0
}
停止垂直滚动:
如果要垂直滚动,则需要增加contentOffset.y。防止停止滚动视图在垂直方向滚动。
- (void)scrollViewDidScroll:(UIScrollView *)sender {
sender.contentOffset.y = 0.0
}
以上代码会阻止x
的{{1}}和y
中的更改,并导致停止scrollview contentOffset
方法中的滚动。
答案 2 :(得分:10)
因为iOS7使用
self.automaticallyAdjustsScrollViewInsets = NO;
//并创建包含3页
的页面滚动条 self.pageView = [[UIScrollView alloc] initWithFrame:CGRectMake(0, 0, self.view.frame.size.width, self.view.frame.size.height)];
[self.pageView setContentSize:CGSizeMake(self.view.frame.size.width*3, self.view.frame.size.height)];
[self.pageView setShowsVerticalScrollIndicator:NO];
[self.pageView setPagingEnabled:YES];
[self.view addSubview:self.pageView];
答案 3 :(得分:10)
快速解决方案
创建两个出口,一个用于您的视图,另一个用于滚动视图:
@IBOutlet weak var myView: UIView!
@IBOutlet weak var scrollView: UIScrollView!
然后在viewDidLayoutSubviews中添加以下代码:
let scrollSize = CGSize(width: myView.frame.size.width,
height: myView.frame.size.height)
scrollView.contentSize = scrollSize
我们已经完成的工作是收集视图的高度和宽度,并设置scrollViews内容大小以匹配它。这将阻止您的滚动视图水平滚动。
更多想法:
CGSizeMake需要宽度和宽度使用CGFloats的高度。您可能需要使用UIScrollViews现有高度作为第二个参数。看起来像这样:
let scrollSize = CGSize(width: myView.frame.size.width,
height: scrollView.contentSize.height)
答案 4 :(得分:4)
您可以选择视图,然后在Attributes Inspector
下取消选中User Interaction Enabled
。
答案 5 :(得分:0)
一旦我用UITableView替换UIScrollView只有1个单元格,它运行正常。
答案 6 :(得分:0)
我在这方面努力了一段时间,试图在这个和其他线程中不成功地提出各种建议。
然而,在另一个线程(不确定在哪里),有人建议在UIScrollView上使用负面约束为他工作。
所以我尝试了各种约束组合和不一致的结果。最终对我有用的是向滚动视图添加-32的前导和尾随约束,并添加宽度为320(并居中)的(不可见)文本视图。
答案 7 :(得分:0)
我在viewDidLoad中设置了tableview contentInset(如下所示)导致水平滚动的原因
require_once 'vendor/autoload.php';
require_once 'myproject_class.php';
require 'forum/init.php';
//forum initialize
\IPS\Session\Front::i();
$ips_member = \IPS\Member::loggedIn();
//load class
try {
$myproj = new MySpace\MyProject();
$myproj->ips_member = $ips_member;
} catch (Exception $e) {
die($e->getMessage()); //not die, but handle in some way
}
//check get or post var to decide what to do
if ($_GET["dowhat"] == "display"){
try {
$myproj->displaySomeData($_GET["id"]);
} catch (Exception $e) {
die($e->getMessage()); //not die, but handle in some way
}
}
//twig rendering
$loader = new Twig_Loader_Filesystem('template');
$twig = new Twig_Environment($loader);
$template = $twig->load('myproject.html');
echo $template->render(array('projectdata' => $myproj->projectdata, 'member' => $ips_member));
检查是否存在因各种原因设置的tableview contentInset并将其禁用
答案 8 :(得分:0)
试试这个:
CGSize scrollSize = CGSizeMake([UIScreen mainScreen].bounds.size.width, scrollHeight);
[scrollView setContentSize: scrollSize];
答案 9 :(得分:0)
使用此单行。
self.automaticallyAdjustsScrollViewInsets = NO;
答案 10 :(得分:0)
在我的情况下,contentView的宽度大于UIScrollView的宽度,这就是不必要的水平滚动的原因。我通过将contentView的宽度设置为UIScrollView的宽度来解决它。
希望它对某人有帮助
答案 11 :(得分:0)
就我而言,通过 Swift 4.2,您可以使用:
禁用垂直滚动:
func scrollViewDidScroll(_ scrollView: UIScrollView) {
scrollView.contentOffset.y = 0.0
}
禁用水平滚动:
func scrollViewDidScroll(_ scrollView: UIScrollView) {
scrollView.contentOffset.x = 0.0
}
答案 12 :(得分:0)
通过覆盖子类中的contentOffset
属性来禁用水平滚动。
override var contentOffset: CGPoint {
get {
return super.contentOffset
}
set {
super.contentOffset = CGPoint(x: 0, y: newValue.y)
}
}
答案 13 :(得分:0)
iOS 11中引入了UIScrollView
上的新属性
var contentLayoutGuide: UILayoutGuide
文档指出您:
当您要创建与滚动视图的内容区域相关的自动布局约束时,请使用此布局指南。
连同您可能要添加的其他任何自动布局约束,您都希望将widthAnchor
的{{1}}的{{1}}约束为与“框架”相同的大小。可以使用UIScrollView
(在iOS 11中也引入了)或任何外部宽度(例如contentLayoutGuide
的宽度)。
示例:
frameLayoutGuide
文档: https://developer.apple.com/documentation/uikit/uiscrollview/2865870-contentlayoutguide
答案 14 :(得分:0)