Answers:
展示完整的工作代码片段总是很不错的:
// in viewDidLoad (if using Autolayout check note below):
UIScrollView *myScrollView;
UIView *contentView;
// scrollview won't scroll unless content size explicitly set
[myScrollView addSubview:contentView];//if the contentView is not already inside your scrollview in your xib/StoryBoard doc
myScrollView.contentSize = contentView.frame.size; //sets ScrollView content size
迅捷4.0
let myScrollView
let contentView
// scrollview won't scroll unless content size explicitly set
myScrollView.addSubview(contentView)//if the contentView is not already inside your scrollview in your xib/StoryBoard doc
myScrollView.contentSize = contentView.frame.size //sets ScrollView content size
我还没有找到一种在IB中设置contentSize的方法(从Xcode 5.0开始)。
注意:如果使用自动布局,则放置此代码的最佳位置是-(void)viewDidLayoutSubviews
method内。
myScrollView.delegate = self
ALSO,如果仍然无法使用,则下面的答案有很棒的建议(转到xib / StoryBoard并确保已禁用“ AutoLayout”)。专家提示:<UIScrollViewDelegate>
如果您希望进行诸如以编程方式滚动UIScrollView之类的操作,则还可以在.h文件中添加该提示。
viewDidLayoutSubviews
使其对我有用。
如果即使正确设置了contentSize也无法滚动视图,请确保在Interface Builder-> File Inspector中取消选中 “ Use AutoLayout”。
您需要设置contentSize
滚动视图的属性才能使其正确滚动。
如果您使用自动布局,你需要设置contentSize
的viewDidLayoutSubviews
,以便它的自动布局完成后应用。
代码看起来像这样:
-(void)viewDidLayoutSubviews
{
// The scrollview needs to know the content size for it to work correctly
self.scrollView.contentSize = CGSizeMake(
self.scrollContent.frame.size.width,
self.scrollContent.frame.size.height + 300
);
}
contentSize
,以规模contentView
,滚动视图和内容查看的大小似乎变得设置为相同。但是,将的高度设置为contentSize
大于的高度的值contentView
,就可以了。
viewDidLayoutSubviews
在生命周期中可能会多次被调用,因此您冒着增加高度超过预期的风险。
上面的答案是正确的-要使滚动发生,必须设置内容大小。
如果您使用的是界面生成器,那么一种简便的方法是使用用户定义的运行时属性。例如:
尝试将内容大小调整为大量。我不明白为什么即使内容大小似乎大于控件大小,我的滚动视图也不滚动。我发现,如果内容大小小于所需大小,那么它也不起作用。
self.scrollView.contentSize = CGSizeMake(2000, 2000);
而不是2000,您可以输入自己的大数字。如果可行,则表示您调整大小时内容的大小不够大。
滚动视图不需要委托。
取消选中“使用自动版式”对我有用。
环境:xCode 5.0.2 Storyboards ios7
设置in 方法的contentSize
属性。像这样UIScrollview
ViewDidLayoutSubviews
override func viewDidLayoutSubviews() {
super.viewDidLayoutSubviews()
scrollView.contentSize = CGSizeMake(view.frame.size.width, view.frame.size.height)
}
上面的一个小附加内容是您的滚动视图可能无法滚动的实际原因,但有时是不经意间这可能是特别是当通过代码而非IB添加滚动视图时的原因,您可能已将子视图添加到了父视图而不是scrollview这将导致子视图不滚动
并确保内容大小设置为大于父视图框架(duhh !!)
我第一次尝试就使它起作用。具有自动布局和所有功能,无需其他代码。然后集合视图变成香蕉,在运行时崩溃,我找不到错误所在,因此我删除并重新创建了它(我使用的是Xcode 10 Beta4。感觉就像个错误),然后滚动消失了。不过,“收藏夹”视图再次起作用!
很多小时后..这就是它为我修复的。我有以下布局:
UIView
一切都在约束之中。安全区域由系统自动定义。在最坏的情况下,请删除滚动和内容视图的所有约束,并且没有 IB为您重置/创建它们。手动进行设置即可。
基本上,概念是让Content视图适合Scrollview,也就是Safe Area。
但是,这样行不通。内容视图错过了高度。我尽了最大的努力,唯一的办法就是创建一个内容视图高度,将控件拖动到内容视图本身。定义了一个固定的高度,该值是从视图控制器的大小(定义为自由格式,比实际显示的长度更长,到包含我的所有子视图)中计算出来的,最后它又可以正常工作了!
以前没有提到的东西!
确保您的插座已正确连接到scrollView!它应该有一个实心圆,但是即使您有实心圆,scrollView也可能没有连接-请仔细检查!将鼠标悬停在圆圈上,看看实际的滚动视图是否突出显示!(这是我的情况)
//Connect below well to the scrollView in the storyBoard
@property (weak, nonatomic) IBOutlet UIScrollView *scrollView;
如果您遵循了教程,那么很多时候代码是正确的,但是许多初学者不知道的是,scrollView 不会在模拟器中正常滚动。假定仅当您按下鼠标垫并同时滚动时才滚动。许多经验丰富的 XCode / Swift / Obj-C用户都习惯这样做,因此他们不知道初学者怎么可能会忽略它。再见 :-)
@IBOutlet weak var scrollView: UIScrollView!
override func viewDidLoad() {
super.viewDidLoad()
view.addSubview(scrollView)
// Do any additional setup after the view
}
override func viewWillLayoutSubviews(){
super.viewWillLayoutSubviews()
scrollView.contentSize = CGSize(width: 375, height: 800)
}
只要您按照我上面所说的去做,这段代码就可以正常工作
如果没有其他解决方案对您有用,请仔细检查滚动视图实际上是否UIScrollView
在Interface Builder中。
在最近几天的某个时候,我的UIScrollView
类型自动更改为a UIView
,即使其类别UIScrollView
在检查员中说了也是如此。我正在使用Xcode 5.1 (5B130a)
。
您可以创建一个新的滚动视图并从旧视图复制测量,设置和约束,也可以手动将视图更改UIScrollView
为xib
文件中的。我进行了比较,发现以下差异:
原版的:
<scrollView clipsSubviews="YES" multipleTouchEnabled="YES" contentMode="scaleToFill" directionalLockEnabled="YES" bounces="NO" pagingEnabled="YES" showsHorizontalScrollIndicator="NO" showsVerticalScrollIndicator="NO" translatesAutoresizingMaskIntoConstraints="NO" id="Wsk-WB-LMH">
...
</scrollView>
类型自发更改后:
<view clearsContextBeforeDrawing="NO" contentMode="scaleToFill" translatesAutoresizingMaskIntoConstraints="NO" customClass="UIScrollView" id="qRn-TP-cXd">
...
</view>
所以我用<view>
原来的<scrollView>
线代替了那条线。
我也换成了视图的结束标记</view>
用</scrollView>
。
在这种情况下,请确保ID与当前视图保持相同:id =“ qRn-TP-cXd”。
我还必须通过删除应用程序的派生数据来从Xcode的缓存中清除xib:
Xcode->Window->Organizer->Projects
,选择项目,在“派生数据”行上,单击“删除...”。或者,如果使用设备:
Xcode->Window->Organizer->Device
,选择您的设备->应用程序,选择您的应用程序,然后单击(-)现在清理项目,然后从模拟器/设备中删除该应用程序:
Xcode->Product->Clean
Simulator/device->press
并按住app->click
(X)将其删除然后,您应该能够构建和运行您的应用程序,并再次具有滚动功能。
PS我不必设置滚动视图的内容大小viewDidLayoutSubviews
或关闭自动布局,而是YMMV。
如果您scrollView
是containerView
某类型的子视图,请确保您scrollView
位于的框架或范围内containerView
。我containerView.clipsToBounds = NO
仍然可以看到scrollView,但是因为scrollView
不在containerView
它的范围内,所以无法检测到触摸事件。
例如:
containerView.frame = CGRectMake(0, 0, 200, 200);
scrollView.frame = CGRectMake(0, 200, 200, 200);
[containerView addSubview:scrollView];
scrollView.userInteractionEnabled = YES;
您将能够看到scrollView,但不会收到用户交互。
另一个有趣的案例:
scrollview.superview.userInteractionEnabled必须为true
我浪费了2个多小时来追逐它,只是为了弄清楚父级是UIImageView,它自然有userInteractionEnabled == false
在此线程中提供的答案失败之后,我偶然发现了该解决方案。
使用自动布局设置滚动视图有两点不直观:
这是该文章的要旨。有关插图的完整说明,请查看。