额外的 20px 顶部插入 UIScrollView 问题
Extra 20px Top Inset UIScrollView Issue
已提出有关此问题的问题。我尝试了一切,但无法解决我的问题。我挣扎了2个小时,现在我把这个发在这里。
问题:UIScrollView 的顶部 contentInset 总是多出 20px space。
我有 viewcontroller xib,没有故事板。
首先,Whosebug上的相关问题及其解决方案假设UIScrollView是UIViewController的根视图。但是我的滚动视图不是根视图,因此可能
self.automaticallyAdjustsScrollViewInsets = NO;
不工作
- 我有一个 HeaderView,前导 space(0, superview),尾随 space(0, superview),顶部 space(0, superview)
和固定高度。
- 下面header视图是带有前导space(0, superview)的滚动视图,
尾部 space(0, superview),底部 space(0, superview) 和垂直
space(0,header 视图)
- 内容的滚动视图中有一个视图。这个观点有
前导 (0)、尾随 (0)、底部 (0) 和顶部 (0) space 到滚动视图。
这是额外的 20 像素顶部插图的屏幕截图。额外的 20px 是 UIScrollView 的白线和浅灰色内容之间的黑色区域我无法修复这个问题。
我是不是做错了什么?自动布局约束似乎很好。
您是否将控制器嵌入到导航控制器中? iOS 似乎在顶部留出 20px 用于状态栏,但您的控制器没有。
无论哪种方式,在你的 viewDidLoad 中,如果你在调用 super 之前调整 scrollView,它应该可以工作:
- (void)viewDidLoad {
self.automaticallyAdjustsScrollViewInsets = NO;
self.scrollView.contentInset = UIEdgeInsetsMake(0,0,0,0);
[super viewDidLoad];
}
iOS 可能会自动强制您的 scrollView 具有 20px TOP contentInset 的原因是因为它可能是主视图中索引为 0 的视图。您可以在这里进一步阅读:http://b2cloud.com.au/how-to-guides/uiviewcontroller-changes-in-ios7
By default, a UIViewController will automatically adjust the content
insets of it’s UIScrollView (including UITableViews) at view index 0,
the very back. This means if there’s a button, label, or any other
view behind your table view, you wont get this behaviour for free.
这里是 Pauls 在 SWIFT 4 中接受的答案:
override func viewDidLoad() {
backGroundScrollView.contentInsetAdjustmentBehavior = .never
backGroundScrollView.contentInset = UIEdgeInsetsMake(0, 0, 0, 0)
super.viewDidLoad()
}
对于 iOS 11.1 及更高版本:
Swift 5
if #available(iOS 11.1, *) {
self.tableView.verticalScrollIndicatorInsets.top = CGFloat.leastNonzeroMagnitude
}
ObjC
if (@available(iOS 11.1, *)) {
self.tableView.verticalScrollIndicatorInsets = UIEdgeInsetsMake(__DBL_MIN__, 0, 0, 0);
}
我不使用 0
而使用 CGFloat.leastNonzeroMagnitude
的原因是在某些情况下 iOS 应用默认值,当值设置为 0
已提出有关此问题的问题。我尝试了一切,但无法解决我的问题。我挣扎了2个小时,现在我把这个发在这里。
问题:UIScrollView 的顶部 contentInset 总是多出 20px space。
我有 viewcontroller xib,没有故事板。
首先,Whosebug上的相关问题及其解决方案假设UIScrollView是UIViewController的根视图。但是我的滚动视图不是根视图,因此可能
self.automaticallyAdjustsScrollViewInsets = NO;
不工作
- 我有一个 HeaderView,前导 space(0, superview),尾随 space(0, superview),顶部 space(0, superview) 和固定高度。
- 下面header视图是带有前导space(0, superview)的滚动视图, 尾部 space(0, superview),底部 space(0, superview) 和垂直 space(0,header 视图)
- 内容的滚动视图中有一个视图。这个观点有 前导 (0)、尾随 (0)、底部 (0) 和顶部 (0) space 到滚动视图。
这是额外的 20 像素顶部插图的屏幕截图。额外的 20px 是 UIScrollView 的白线和浅灰色内容之间的黑色区域我无法修复这个问题。
我是不是做错了什么?自动布局约束似乎很好。
您是否将控制器嵌入到导航控制器中? iOS 似乎在顶部留出 20px 用于状态栏,但您的控制器没有。
无论哪种方式,在你的 viewDidLoad 中,如果你在调用 super 之前调整 scrollView,它应该可以工作:
- (void)viewDidLoad {
self.automaticallyAdjustsScrollViewInsets = NO;
self.scrollView.contentInset = UIEdgeInsetsMake(0,0,0,0);
[super viewDidLoad];
}
iOS 可能会自动强制您的 scrollView 具有 20px TOP contentInset 的原因是因为它可能是主视图中索引为 0 的视图。您可以在这里进一步阅读:http://b2cloud.com.au/how-to-guides/uiviewcontroller-changes-in-ios7
By default, a UIViewController will automatically adjust the content insets of it’s UIScrollView (including UITableViews) at view index 0, the very back. This means if there’s a button, label, or any other view behind your table view, you wont get this behaviour for free.
这里是 Pauls 在 SWIFT 4 中接受的答案:
override func viewDidLoad() {
backGroundScrollView.contentInsetAdjustmentBehavior = .never
backGroundScrollView.contentInset = UIEdgeInsetsMake(0, 0, 0, 0)
super.viewDidLoad()
}
对于 iOS 11.1 及更高版本:
Swift 5
if #available(iOS 11.1, *) {
self.tableView.verticalScrollIndicatorInsets.top = CGFloat.leastNonzeroMagnitude
}
ObjC
if (@available(iOS 11.1, *)) {
self.tableView.verticalScrollIndicatorInsets = UIEdgeInsetsMake(__DBL_MIN__, 0, 0, 0);
}
我不使用 0
而使用 CGFloat.leastNonzeroMagnitude
的原因是在某些情况下 iOS 应用默认值,当值设置为 0