Установить альфа по дате - PullRequest
       4

Установить альфа по дате

2 голосов
/ 20 ноября 2011

Мой клиент / попросил меня установить непрозрачность (альфа) для различных различных меток, найденных в MKMapView, в зависимости от даты.

Для самой старой половины меток он хотел бы, чтобыЧтобы установить непрозрачность 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 ]

2 голосов
/ 20 ноября 2011

Если это просто вопрос объекта в [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.

2 голосов
/ 20 ноября 2011

Сначала вы должны получить время, прошедшее между самой старой датой и самой поздней датой:

NSTimeInterval maxTimeElapsed = [latestDate timeIntervalSinceDate:oldestDate];

Затем для каждой метки необходимо выполнить следующее:

NSTimeInterval timeElapsed = [oldestDate timeIntervalSinceDate:fix.date];
[annotationView setAlpha:1 - ((maxTimeElapsed - timeElapsed) / maxTimeElapsed) / 2];

Таким образом, с более старыми датами timeElapsed будет ближе к 0, в результате чего альфа-значения ближе к 0,5. А с более новыми датами timeElapsed будет ближе к maxTimeElapsed, делая альфа ближе к 1 (и альфа = 1 с самой последней датой).

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...