首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >使用Swift中的UIViews在可视时间线上定位多个NSLayoutConstraint

使用Swift中的UIViews在可视时间线上定位多个NSLayoutConstraint
EN

Stack Overflow用户
提问于 2016-09-12 16:22:39
回答 1查看 715关注 0票数 1

我需要弄清楚如何定位3-5 UIViews (基本上是一个圆形绘制的彩色点)的水平线,这是从一边到另一边,在屏幕上的约束。还是不受约束地去更好呢?

线路应以一天(24小时)为基础。

例如,如果我有3个NSDates,它表示三次(7:00、12:00和22:00),我希望它们在时间线上被正确定位:

编辑。再多想一想,我就会发现我无法做到这一点。问题是,时间线上的每个点都是一个特定任务的"todo"-time。但可能有几个任务。每个任务都是一个表格单元格。因此,将有多个时间表:

-12-18

因为每个点在上面都有一个标签,所以我不能根据时间来定位这些点。因为在垂直方向上没有24种位置的空间。因此,对于具有相同时间的点(在两个不同的时间线中)将不能正确地对齐。

现在我是如何解决这个问题的:将每个任务划分为两个数组,一个在12.00之前一直执行,另一个在12.00之后执行。

然后,我使用第一个数组,从左侧最早的时间开始(约束导致superview),其余的从右到视图,以此类推。

然后,我接受第二个数组,并从末尾(最新的时间)开始,然后将它们添加到右边(约束拖到superview),其余的添加到前面的视图,依此类推。

这就是结果:在这里输入图像描述

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2016-09-12 21:14:57

我也做过类似的事。我为每个表视图单元格视图返回一个UIImage,并根据一个NSDate水平地排列数字。您只需将NSDate转换为CGFloat值即可。这个扩展为我提供了一个十进制值,表示来自NSDate的小时和分钟。

代码语言:javascript
运行
复制
extension NSDate {
    var hourInDecimal: CGFloat {
        get {
            let userCalendar = NSCalendar.currentCalendar()

            let timeNowInDecimal = CGFloat(userCalendar.component(.Hour, fromDate: self)) + CGFloat(userCalendar.component(.Minute, fromDate: self))/60
            return timeNowInDecimal
        }
    }
}

如果是24小时的话,横向安装是很困难的,所以我只使用数据从第一个小时到最后一个小时。上午7点-> 10点确实符合。

然后得到从左边边缘的距离(对于约束).

代码语言:javascript
运行
复制
let oneHourWidth = containerView.width/(lateHour - earlyHour)
let distanceToLeftEdge = oneHourWidth * (eventTime.hourInDecimal - earlyHour)

请注意,上述对Swift 3的一些更改。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/39454736

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档