- iOS/Objective-C 元类和类别
- objective-c - -1001 错误,当 NSURLSession 通过 httpproxy 和/etc/hosts
- java - 使用网络类获取 url 地址
- ios - 推送通知中不播放声音
这是我的 View ,左边是键盘不显示时的 View ,右边是键盘显示时我想要实现的 View 。
我所有的字段都被添加到一个 ScrollView ,然后我像这样设置约束,field1 topConstraint 设置为 scrollView top,field4 bottomConstraint 设置为 scrollView bottom。所有其他字段都附加到下面的字段。
正如您从最右边的模型中看到的那样,当显示键盘时,我想像那样重新调整 View 。所以我现在正在做的是:
func keyboardWillShow(notification: NSNotification) {
self.field2.snp_updateConstraints { make -> Void in
make.bottom.equalTo(self.field3.snp_top).offset(8)
}
用这个我调整了 field2 和 field3 之间的大空间,到目前为止一切顺利。然后我继续设置 contentInset:
let contentInset = UIEdgeInsetsMake(0, 0,getKeyboardSize(notification).height, 0)
self.scrollView.contentInset = contentInset
self.scrollView.scrollIndicatorInsets = contentInset
但是 scrollView 没有按照我想要的方式调整,因为 field3 仍然隐藏在键盘后面的一半。
写这篇文章的原因是我显然不明白 contentInsets 如何与 scrollView 一起工作,我想避免手动设置 contentOffset,如果可能的话。
我设置的约束似乎有问题。 field4 的当前约束是我将它设置为绑定(bind)到 View 而不是 scrollView 底部,并且我将 scrollView 的每个边缘设置为绑定(bind)到 View 。
更新:如果我将 field4 底部约束设置为绑定(bind)到 scrollView,则 scrollViews 高度为 0,如果我之前将 scrollView 设置为与 View 本身一样大,它怎么会不知道它应该是什么大小?这让我很困惑..
更新 2我正在像这样设置 scrollView 约束:
self.scrollView.snp_makeConstraints { make -> Void in
make.top.equalTo(self.snp_topLayoutGuideBottom)
make.left.right.equalTo(self.view)
make.bottom.equalTo(self.snp_bottomLayoutGuideBottom)
}
从 UIDebugger 我可以看到 scrollView 的高度是一样的,但是 Y 坐标已经变成了 20,但是我仍然不能在其中滚动??此外,在调试时,我可以将 scrollViews contentSize 设置为大于框架,这意味着它应该是可滚动的,但事实并非如此。
更新 3我现在明白 Field1 和 Field4 都需要附加到 scrollViews 的顶部和底部。因此,scrollViews frame 和 scrollViews contentSize 之间存在差异,因为当 contentSize > frame scrollView 可滚动时,它按预期工作。所以这对我来说是向前迈出的一大步,现在唯一奇怪的是 contentInset。
我对 contentInset 的理解是,您可以指定 View 在任一方向上应该缩小多少。所以就像现在一样,我正在使用 scrollView 底部的键盘高度进行插入,但它没有滚动,但是当我将顶部 contentInset 设置为某个随机负数(如 -100)时,它会滚动,为什么调整底部插图时未实现此行为?
最佳答案
所以我用下面的方法解决了这个问题:
我确保为 ScrollView 设置了 Field1 和 Field4 约束,这样 ScrollView 就可以自动计算高度,并且如果某些内容在 View 之外也可以滚动。然后我从键盘顶部和框架计算出可见框架。
func keyboardWillShow(notification: NSNotification) {
self.Field2.snp_updateConstraints { make -> Void in
make.bottom.equalTo(self.Field3.snp_top)
}
self.Field3.snp_updateConstraints { make -> Void in
make.bottom.equalTo(self.Field4.snp_top)
}
self.view.layoutIfNeeded()
let contentInset = UIEdgeInsetsMake(0, 0,getKeyboardSize(notification).height + 4, 0)
let visibleRect = UIEdgeInsetsInsetRect(self.scrollView.frame, contentInset)
let scrollToOffset = max(0,self.Field4.frame.maxY - visibleRect.height)
self.scrollView.setContentOffset(CGPoint(x: 0, y: scrollToOffset), animated: true)
}
关键是在更改约束后,我需要使当前布局无效并重新布局 View ,这样我们就可以计算更新的约束在哪里可以正确完成。
关于ios - scrollView 的 ContentInset,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/38832770/
我正在尝试创建一个类似于 BBC 新闻 native 应用程序的布局(使用known.js);一个垂直的ScrollView,其中有许多水平的ScrollView。我已经“工作”到了一切都渲染并且水平
我正在尝试创建一个类似于 BBC 新闻 native 应用程序的布局(使用known.js);一个垂直的ScrollView,其中有许多水平的ScrollView。我已经“工作”到了一切都渲染并且水平
我已经为以下问题寻找了很多答案,但没有找到合适的解决方案(也不是“不可能”)。我不想要双向 ScrollView! 我想要的只是拥有这样的东西: 如果我这样做(具有所需的布局属性),我会得到我的
我想使用 famo.us 标准 Scrollview但是有一个以不同速度滚动的背景图像以产生视差效果。 我想知道是否有一种方法可以连接到事件流,或者以某种方式将 Scrollviews 位置通过管道传
初始化程序中有一个带有 ScrollView(alwaysBounceVertical: false) 的属性,但我似乎找不到它了。 有谁知道如何禁用 SwiftUI ScrollView 上的垂直弹
在你说之前 “Google 说不要这样做” 请阅读我的所有问题!! 布局: ScrollView -> RelativeLayout -> ScrollView -> RelativeLayout 第
我想在 Windows 7 上创建一种体验(使用触摸),我可以在其中拥有一个只能垂直滚动的外部 ScrollViewer(它是屏幕的大小)。在那个 ScrollViewer 中,我将有几个其他的 Sc
我知道 Google 的人要求我们不要将 Scrollable View 放在另一个 Scrollable View 中,但他们是否有任何官方声明指示我们不要这样做? 最佳答案 试试这个 注意:这里
更新Xcode11 beta3后,我发现scrollview内部 View 的阴影会在边界处被切断,但在Xcode11 beta2中还可以。我只是使用底部填充来修复它,但我认为这不是一个好的解决方案。
我的 wpf 应用程序的结构如下: 我的目标是,如果 DataGrid 超过屏幕的高度来使用它自己的 Scrollviewer。目前只使用外部的 S
我在其他应用程序中使用了 ScrollView,只添加了 style={styles.container}与风格。然而,在这个应用程序中,我正在创建我的风格 alignItems:'flex-star
这是我的布局 xml。 ... 我已经尝试过此链接中的解决方案: ScrollView Inside ScrollVie
有没有办法在 nativescript 的 ScrollView 上隐藏滚动指示器?我试过 scrollBars='none' 和 css overflow='hidden' 但它不能同时工作。谢谢
所以我有一个 ScrollView ,里面有一个 TextView 。当文本的String长于屏幕宽度时,它只是在下一行中移动。我想通过在 ScrollView 中添加 HorizontalScr
我正在尝试在 android 的水平 ScrollView 中创建一个水平 ScrollView 。第一个水平 ScrollView 工作正常。当我尝试滚动时,第二个水平 ScrollView 不起作
我在同一布局中创建了两个 ScrollView。你可以说一个平行的 ScrollView 。我想手动滚动一个 ScrollView ,作为响应,另一个 ScrollView 应该以完全相同的方式滚动。
我在 android 中设计 UI,我在另一个 HorizontalScrollView 中有一个 HorizontalScrollView。但是,子 HorizontalScrollVi
我在另一个 ScrollView 中有 ScrollView 。我想滚动内部 ScrollView ,但外部 ScrollView 只滚动。如何解决这个问题? 谢谢。 最佳答案 sv01 =
我有两个 UIScrollView,如果用户在 ScrollView 中滚动,我想让另一个 ScrollView 也滚动。我已经阅读了一个解决方案,涉及将 pangesturerecognizer 从
我以编程方式创建了 UIScrollView 并向其中添加了多个 button。 它运行良好,没有任何问题。 但我需要通过复制先前 ScrollView 的内容来创建另一个 ScrollView 。
我是一名优秀的程序员,十分优秀!