2010-10-16 3 views
1

Я использую изображение для отображения всего содержимого UITableViewCell, и он устанавливается с использованием свойства backgroundView.UITableViewCell backgroundView изменение размера изображения?

Моя проблема в том, что она всегда масштабируется, чтобы соответствовать ячейке. Есть ли способ отключить масштабирование в этом случае, поэтому я могу предоставить только 480-пиксельную версию, и она просто обрезается, когда ориентация - портрет?

Я делаю это так:

- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath {  
    static NSString *CellIdentifier = @"Cell"; 

    UITableViewCell *cell = [tableView dequeueReusableCellWithIdentifier:CellIdentifier]; 
    if (cell == nil) { 
     cell = [[[UITableViewCell alloc] initWithStyle:UITableViewCellStyleDefault reuseIdentifier:CellIdentifier] autorelease]; 
    } 
     UIImageView *bgView = [[UIImageView alloc] initWithImage:[UIImage imageNamed:[NSString stringWithFormat:@"menu.0%d.large.png", indexPath.row+1]]]; 
     UIImageView *selectedBgView = [[UIImageView alloc] initWithImage:[UIImage imageNamed:[NSString stringWithFormat:@"menu.0%d.large.selected.png", indexPath.row+1]]];  
     cell.backgroundView = bgView; 
     cell.selectedBackgroundView = selectedBgView;   
     [bgView release]; 
     [selectedBgView release]; 
    return cell; 
} 

Я попытался с помощью двух версий изображений, чтобы переключаться между ними при изменении ориентации. Это пока работает, но у него есть недостаток, который вы всегда видите масштабирование во время обработки анимации.

Спасибо за вашу помощь

Arne

ответ

1

Я не пробовал это на тренажере или устройстве, но следующий может работать:

- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath {  
static NSString *CellIdentifier = @"Cell"; 

UITableViewCell *cell = [tableView dequeueReusableCellWithIdentifier:CellIdentifier]; 
if (cell == nil) { 
    cell = [[[UITableViewCell alloc] initWithStyle:UITableViewCellStyleDefault reuseIdentifier:CellIdentifier] autorelease]; 
} 
    // New! 
    cell.backgroundView.clipsToBounds = YES; 

    UIImageView *bgView = [[UIImageView alloc] initWithImage:[UIImage imageNamed:[NSString stringWithFormat:@"menu.0%d.large.png", indexPath.row+1]]]; 
    UIImageView *selectedBgView = [[UIImageView alloc] initWithImage:[UIImage imageNamed:[NSString stringWithFormat:@"menu.0%d.large.selected.png", indexPath.row+1]]];  
    // New! 
    bgView.center = CGPointMake(160, 25); // Adjust the y-Value to be exactly half of the height of your cell 
    bgView.autoresizingMask = UIViewAutoresizingFlexibleRightMargin | UIViewAutoresizingFlexibleLeftMargin; // Not quite sure whether these two will work, maybe you have to play a little with the Masks 

    cell.backgroundView = bgView; 
    cell.selectedBackgroundView = selectedBgView;   
    [bgView release]; 
    [selectedBgView release]; 
return cell; 
} 

Позвольте мне знать, удалось ли вам получить его работу.

+0

Спасибо за ваш ответ. Я был слишком поздно, чтобы проверить это, поскольку я уже нашел решение Джеймса, когда вернусь. Но спасибо за вашу помощь! – arnekolja

+0

Спасибо! Я использовал 'UIViewContentModeTopLeft' в сочетании с' clipToBounds = YES', чтобы заставить его работать для моего проекта. – primehalo

6

Установите режим содержимого в виде фонового изображения.

bgView.contentMode = UIViewContentModeTopLeft; 
selectedBgView.contentMode = UIViewContentModeTopLeft; 

Это говорит UIImageView поместить свое изображение в верхнем левом углу, а не его масштаб, чтобы соответствовать.

+0

Не знал, что один, гораздо умнее (и короче), чем моя идея :) – Robin

+0

Иногда это платит быть ленивым. :) Это свойство 'UIView', поэтому оно очень удобно в нескольких местах. –

+0

Я играл с contentMode, но, похоже, я сделал это не в том месте. Спасибо, это работает как charme :) – arnekolja

Смежные вопросы