ios - 如何防止 UIScrollView 切断按钮?
问题描述
我想知道防止滚动视图切断页面边框上的按钮/视图的选项。我的应用程序有一个充当文本编辑器的文本视图。它有一个用于键盘的输入附件视图,其中包含大约 20 个不同的工具栏格式按钮,供用户应用于文本。因为按钮太多,所以工具栏附件视图处于水平滚动的滚动视图中。
我的问题是,在某些屏幕上(取决于设备屏幕尺寸),按钮可能会在视图边缘被切断。当滑动到下一页时(它使用分页),按钮仍然在屏幕的另一侧被切断。我将附上两个屏幕截图,显示在页面滑动之前和之后切断下划线按钮。
注意最右边的“U”按钮:
滑动页面后,“U”位于最左侧:
我希望用户可以完全访问这些按钮。这可能意味着该按钮可以被切断,但在页面滑动时它将完全可见。或者这可能意味着如果按钮被切断,按钮将不会显示在屏幕上。
我试过的:
- 我试图关闭分页,这可行,但在这种情况下我们更喜欢分页,所以这是最后的手段。
- 我最大的努力是尝试根据屏幕可以容纳多少按钮来对按钮进行分组。想法是将按钮分组为“页面”并滚动不同的页面。因为按钮的大小不同,所以我必须在它们呈现到屏幕上时读取它们的大小。我几乎不是这方面的专家,最接近的方法是工具栏按钮视图类 (UIView) 上的 didMoveToWindow() 方法。但这有时会有按钮大小,有时没有按钮大小。我不知道为什么。如果我将代码放在类的初始化程序中,按钮还没有大小,在初始化附件视图的滚动视图时它们也没有大小。didMoveToWindow() 是我发现的唯一提供尺寸的方法,但即使这样也不是 100%。
override func didMoveToWindow() {
var buttonSizeArray: [CGFloat] = []
for button in op1ButtonList {
buttonSizeArray.append(button.frame.width)
}
let buttonSpacing: CGFloat = 12
let leadingSpacing: CGFloat = 10
var sizeDict: [Int:CGFloat] = [:]
for (index, buttonSize) in buttonSizeArray.enumerated() {
if index == 0 {
sizeDict[index] = leadingSpacing + buttonSize
} else {
sizeDict[index] = buttonSpacing + buttonSize + sizeDict[index - 1]!
}
}
for index in 0..<buttonSizeArray.count {
if sizeDict[index]! < UIScreen.main.bounds.size.width {
// keep track of the last button that fit on the screen
continue
}
break
// code to group the buttons into views for the scroll view to use
}
}
在以这种方式使用滚动视图时,其他人是否遇到过这种情况并找到了一个好的解决方案?我找到的答案主要指向开发人员正确设置页面大小,以便视图包含预期的内容,但在这种情况下,我还没有找到始终如一地获得所需大小的方法。我也绝对愿意接受其他解决方案。
解决方案
推荐阅读
- python - Pygame如何解决这个迷宫?
- amazon-web-services - 将视频转换为不同质量的 AWS MediaConvert
- json - 如何向来自 CloudWatch 代理的日志添加自定义项
- spring-boot - Spring Boot 不支持 hikari keepaliveTime 配置
- mysql - Laravel 自定义 belongsTo 动态绑定
- python - 如何根据我收到的错误消息更新数据库?
- javascript - 使用 Fetch 从后端 API 收集信息?
- python - 如何在 python 中为 RNN 设置初始拓扑?
- php - 产品在 php 数组中出现两次
- angular - 后端翻译在 SSR Spartacus 中不起作用