Встраивание рекламы в uitableview каждые "х" ячеек
Я пытался встроить рекламу Google в удобный для просмотра вид "X", я следовал этому руководству: ( http://googleadsdeveloper.blogspot.com/2012/03/embedding-google-admob-ads-within.html), но я нахожу, что табличное представление не всегда показывает все данные в источнике данных, когда я добавляю ячейки для рекламы, обычно она отключается несколькими ячейками. Я считаю, что это связано с numberOfRowsInInSection
функция, но для жизни я не могу заставить себя по математике, чтобы рассчитать эту ошибку. Пока у меня есть следующее: (kAdCellFrequency в настоящее время 10, но это должно быть изменено на произвольное значение):
-(NSInteger)tableView:(UITableView *)tableView numberOfRowsInSection:(NSInteger)section {
id<NSFetchedResultsSectionInfo> sectionInfo = [[eventResults sections] objectAtIndex:0];
int sectionObjectsCount = [sectionInfo numberOfObjects];
int advertCellCount = ([sectionInfo numberOfObjects])/kAdCellFrequency;
int additionalCellCount = sectionObjectsCount%kAdCellFrequency;
NSLog(@"event count %i Ad cell count %i additional count %i total cell count %i cells",sectionObjectsCount, advertCellCount, additionalCellCount, sectionObjectsCount+advertCellCount+additionalCellCount);
SDMEvent *theEvent = [[eventResults fetchedObjects]objectAtIndex:sectionObjectsCount-1];
NSLog(@"Final object name %@",theEvent.eventName);
return sectionObjectsCount+advertCellCount+additionalCellCount;
//return sectionObjectsCount;
}
Я добавил переменную AdditionalCellCount, так как при использовании значения 10 для kAdCellFrequency данные находились на расстоянии 3 ячеек от правильных, но эта же математика не отображает правильное количество, если для kAdCellFrequency установлено значение 5.
Создание ячейки рекламы ячейки или стандартной ячейки события:
adCell = (UICellWithAdvert *) [tableView dequeueReusableCellWithIdentifier:@"UICellWithAdvert"];
eventCell = (UISDMEventCell *) [tableView dequeueReusableCellWithIdentifier:@"UISDMEventCell"];
NSLog(@"index: %i cell freq: %i result: %i",[indexPath row], kAdCellFrequency, [indexPath row]%kAdCellFrequency);
if (([indexPath row] % kAdCellFrequency) == kAdCellFrequency-1) { // Advert cell dont add cell at index 0!
if (!adCell) {
NSArray *topLevelObjects = [[NSBundle mainBundle] loadNibNamed:@"UICellWithAdvert" owner:nil options:nil];
for(id currentObject in topLevelObjects){
if ([currentObject isKindOfClass:[UICellWithAdvert class]]) {
adCell = (UICellWithAdvert *)currentObject;
}
}
}
// remove the advert from its current cell
[googleAdvert removeFromSuperview];
// add to cell if it doesn't have advert
if (!googleAdvert.superview) {
[adCell addSubview:googleAdvert];
NSLog(@"Add cell with Advert");
}
return adCell;
}
else{ // event cell
if (!eventCell) {
NSArray *topLevelObjects = [[NSBundle mainBundle] loadNibNamed:@"UISDMEventCell" owner:nil options:nil];
for(id currentObject in topLevelObjects){
if ([currentObject isKindOfClass:[UISDMEventCell class]]) {
eventCell = (UISDMEventCell *)currentObject;
}
}
}
return eventCell;
}
Отображение содержимого в индексе ячейки, я вынул фактическую настройку данных, просто нужно вычисление:
-(void)tableView:(UITableView *)tableView willDisplayCell:(UITableViewCell *)cell forRowAtIndexPath:(NSIndexPath *)indexPath{
int calculatedIndex = [indexPath row]-floor((float)[indexPath row]/kAdCellFrequency);
NSLog(@"Calculated %i",calculatedIndex);
NSLog(@"Normal Index %i",[indexPath row]);
}
Любая помощь будет отличной, даже указатель куда-нибудь, где я могу узнать больше об этой математике?
Обновление: ОК, похоже, что количество ячеек возвращается правильно, но в некоторых случаях код устанавливает дублирование содержимого для некоторых ячеек, поэтому, например, ячейка 320 + 321 отображает одно и то же событие. Я думаю, что это связано со следующей математикой в моем исходном коде (это псевдокод):
adCellFrequency = 10
cellIndex = 319
int calculatedIndex = [indexPath row]-floor((float)[indexPath row]/kAdCellFrequency); // equals 288
cellIndex = 320
int calculatedIndex = [indexPath row]-floor((float)[indexPath row]/kAdCellFrequency); // equals 288
Обратите внимание, что значения для обеих ячеек равны 288, что означает, что две ячейки теперь отображают одинаковое содержимое. Таким образом, число ячеек является правильным, но содержимое, представленное для индекса, является неправильным (PaulW - эта проблема также возникает, когда я конвертировал твой код, ты получаешь это... я увеличиваю до 325 ячеек)
1 ответ
Учу тебя ловить рыбу...
- Посмотрите, как на самом деле управляется ваше округление (например, посмотрите на lrintf() и запустите несколько примеров выходных данных диапазона чисел, используя цикл for/).
- Почему бы не вывести значение selectedIndex в метку в ячейке, чтобы можно было более наглядно представить проблему?
- Посмотрите на быстрые способы визуализации математики - даже электронная таблица может помочь.