2011-11-20 130 views
2

我的客戶/要求我根據日期設置MKMapView上發現的各種不同地標的不透明度(alpha)。根據日期設置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

回答

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)。

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,如果它在結尾是正確的,則爲0。所以如果你乘以0.5,你會得到一個介於0和0.5之間的數字,你可以加0.5來得到0.5和1之間的數字。