我的客户/已要求我为MKMapView上的各种不同地标设置不透明度(alpha),具体取决于日期。
对于最旧的一半地方标记,他希望将不透明度设置为0.5。
我可以通过计算地点标记的索引并检查它是否在数组的后半部分来实现。
int indexOfPlacemark = [fixes indexOfObject:fix]; //fixes is the array of Placemarks (named fix).
if (index <= [fixes count] / 2) {
[annotationView setAlpha:0.5];
}
else {
// do something with fix.date to work out the opacity.
// an example of the date is Sun, May 15, 2011 - 12:00:44
}
但是他希望我根据日期提高其他地方标记的不透明度。即最新日期的不透明度为1.0,数组前半部分中最早的日期为〜0.5。
我想知道的是我如何根据日期来计算不透明度。
先谢谢。
XcodeDev
答案 0 :(得分:2)
首先,您应该在最早的日期和最晚的日期之间经过一段时间:
NSTimeInterval maxTimeElapsed = [latestDate timeIntervalSinceDate:oldestDate];
然后,对于每个地标,您应该执行以下操作:
NSTimeInterval timeElapsed = [oldestDate timeIntervalSinceDate:fix.date];
[annotationView setAlpha:1 - ((maxTimeElapsed - timeElapsed) / maxTimeElapsed) / 2];
这样,对于较旧的日期,timeElapsed将更接近于0,从而使alpha更接近0.5。对于较新的日期,timeElapsed将更接近maxTimeElapsed,使alpha更接近1(并且alpha = 1且最新日期)。
答案 1 :(得分:2)
如果只是[fixes count] / 2中的对象具有不透明度0.5而且[fixes count] -1处的对象具有不透明度1.0且两者之间的值均匀分布,那么您可以执行以下操作:
[annotationView setAlpha:(float)indexOfPlacemark / [fixes count]];
如果你有一个NSDate
附加到每个对象并希望根据它进行计算,那么你可能会首先获得日期范围,如:
// set up
NSDate *startDate = [[fixes objectAtIndex:[fixes count]/2] date];
NSDate *endDate = [[fixes lastObject] date];
NSTimeInterval range = [endDate timeIntervalSinceDate:startDate];
// ...
// and later, for each object beyond halfway through the list:
NSTimeInterval timeSinceHalfway = [[fix date] timeIntervalSinceDate:startDate];
[annotationView setAlpha: 0.5 + (timeSinceHalfway / range) * 0.5];
算法相对简单 - 如果将当前对象的时间除以总范围,则得到0到1之间的数字,如果它在范围的开头就是0,如果它在结束时则为1。因此,如果将其乘以0.5,则得到介于0和0.5之间的数字,您可以将其添加0.5以获得介于0.5和1之间的数字。