【问题标题】:Any ideas on how to make a UIPickerView from scratch?关于如何从头开始制作 UIPickerView 的任何想法?
【发布时间】:2011-08-11 12:37:35
【问题描述】:

我已经决定再也不想使用 UIPickerView 了……它在功能、设计和大小(高度)方面完全不灵活。它也偶尔会卡在行之间,并且在松开轮子和触发委托方法之间发生的延迟表明已经选择了新行(因为“安顿”动画)导致了很多问题我一直在开发的应用程序的上下文。

话虽如此,UIPickerView 的用户友好方面还是不错的,我想尝试复制它。我试图研究不同的方法来做到这一点,但没有太大的成功。有没有人知道从头开始制作类似的东西会涉及什么?

我试图让 UITableView 子类以这样的方式运行,即当前位于表格中间的任何单元格(在拖动时会发生变化等)都会将其背景颜色更改为不同的颜色,这意味着它是“选定”。一旦拖动表格以使“选定”单元格不再位于中间,该单元格将恢复正常并且新的中间单元格将改变颜色。所以这就像 UIPickerView 在某种意义上你不必点击一个单元格;相反,您只需拖动以默认选择一个。

我认为拦截 UITableView 的“touchesMoved”方法并添加一些代码循环遍历表格中所有当前可查看的单元格,检查它们的框架是否与表格的中心点重叠应该很容易,并且相应地更改它们的外观(加上根据需要向其他类发送通知以指示“选择”更改)。不幸的是,我无法让它工作,因为当我拖动表格时不会调用“touchesMoved”方法。我错过了什么明显的东西吗?

在这一点上,任何想法或建议都将非常感激......我制作了一个严重依赖 UIPickerView 对象的应用程序,并且由于我遇到的问题,我将不得不放弃它,除非我可以想出办法来完成这项工作。

非常感谢,

克里斯

【问题讨论】:

    标签: iphone cocoa-touch uitableview uipickerview


    【解决方案1】:

    请记住,UITableView 是 UIScrollView 的子类,并且 UITableViewDelegate 也会获取所有 UIScrollViewDelegate 方法调用。 scrollViewDidScroll: 听起来很容易就能知道表格视图何时滚动。

    至于查找哪一行在视图的中间,使用indexPathForRowAtPoint:即可。

    【讨论】:

    • 这正是我想要的。使用这两种方法,这将比我最初提出的要简单得多...感谢您的帮助...非常感谢!
    • 果然,您的建议很有效。我现在或多或少都设置好了(包括当新单元格移动到表格中心时触发的委托方法),但是我的自定义 UITableView 仍然缺少 UIPickerView 的一个基本方面,那就是如果你选择顶行或底行,它们应该在表格中垂直居中(即使这意味着占用一些表格的空白空间)。我查看了 UIScrollView 和 UITableView 的文档,但没有运气。如果这相对容易做到,有什么想法吗?
    • @chrisb:尝试为contentInset设置适当的顶部和底部插入
    • 再一次,您提供的正是我想要的东西。我希望有一天能像在 Apple 文档中一样直观地找到合适的方法……同时,感谢您帮助我。万一其他人试图达到这种效果,我只需将表格的 UIEdgeInsets 的顶部和底部元素设置为 '(tableView.frame.size.height / 2) - ([tableView rowHeight] / 2 )' 来模仿与 UIPickerView 相同的滚动外观。
    • 很好的答案...您是如何解决捕捉到单元格的问题的?我一直在等待 scrollViewDidEndDecelerating: 并使用 setContentOffset:animated: 将其捕捉到最近的单元格,该单元格有效但不完美......还有其他建议吗?
    猜你喜欢
    • 1970-01-01
    • 2021-02-15
    • 2021-06-14
    • 2016-10-12
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-04-25
    相关资源
    最近更新 更多