设备方向切换时如何禁用ScrollView滚动?需Storyboard还是代码实现?
问题解答
- 仅靠Storyboard无法实现这个动态禁用ScrollView滚动的需求,必须通过代码配合完成。
- 你尝试的Size Class只能用于调整布局约束、控件显隐这类静态布局适配,无法直接控制ScrollView的滚动启用状态——因为滚动状态是需要在设备方向切换实时触发的逻辑,Storyboard没有提供这种动态状态绑定的能力。
具体实现方案(结合Size Class判断)
利用traitCollectionDidChange方法监听Size Class变化,在横屏/竖屏对应的Size Class下切换滚动状态:
override func traitCollectionDidChange(_ previousTraitCollection: UITraitCollection?) { super.traitCollectionDidChange(previousTraitCollection) // 判断当前是否为iPhone横屏对应的Size Class(Compact Width + Regular Height) if traitCollection.horizontalSizeClass == .compact && traitCollection.verticalSizeClass == .regular { scrollView.isScrollEnabled = false } else { scrollView.isScrollEnabled = true } }
如果使用Objective-C:
- (void)traitCollectionDidChange:(UITraitCollection *)previousTraitCollection { [super traitCollectionDidChange:previousTraitCollection]; if (self.traitCollection.horizontalSizeClass == UIUserInterfaceSizeClassCompact && self.traitCollection.verticalSizeClass == UIUserInterfaceSizeClassRegular) { self.scrollView.scrollEnabled = NO; } else { self.scrollView.scrollEnabled = YES; } }
补充说明
- 如果横屏时内容完全适配屏幕,也可以在对应Size Class下调整ScrollView的
contentSize等于自身frame大小,但直接禁用滚动状态的方式更直观可靠。 - 需确保已在Storyboard中把ScrollView关联为代码里的IBOutlet。
内容的提问来源于stack exchange,提问作者Eric Parker
相关产品推荐
相关产品推荐

