iPhone + UITableView + разместить изображение для разделителя

У меня в приложении есть UITableView.

Атрибуты: TableStyle = Plain, SeperatorStyle = single и SeperatorColor = black.

Что я хочу сделать, так это то, что я хочу поместить изображение (которое представляет собой небольшую полоску) в качестве разделителя для таблицы.

Пожалуйста помогите.

С уважением, Pratik


person pratik    schedule 09.02.2010    source источник


Ответы (3)


Итак, обычно с таблицей iPhone вы должны просто использовать один из встроенных стилей: http://developer.apple.com/iphone/library/documentation/UIKit/Reference/UITableView_Class/Reference/Reference.html#//apple_ref/occ/instp/UITableView/separatorStyle

Как разработчик iPhone, который прошел этот путь, я предлагаю вам по возможности избегать изображений и использовать API для создания своего приложения.

Если вы настаиваете на своем безрассудном поступке или если у вас есть клиент, требующий этого или чего-то еще, то вы можете создать подкласс UITableViewCell.

В своем подклассе UITableViewCell вы можете добавлять любые элементы пользовательского интерфейса, которые хотите, в contentView ячейки, включая изображение разделителя в нижней части ячейки.

Итак, вот реализация функции делегата, которая возвращает ячейку таблицы с использованием настраиваемого UITableViewCell:

- (UITableViewCell *)tableView:(UITableView *)tableView 
         cellForRowAtIndexPath:(NSIndexPath *)indexPath {

  static NSString *CellIdentifier = @"Cell";

  // notice I use a SavedTableCell here instead of a UITavbleViewCell
  SavedTableCell *cell = (SavedTableCell *)[tableView dequeueReusableCellWithIdentifier:CellIdentifier];

  if (cell == nil) {
    cell = [[[SavedTableCell alloc] initWithReuseIdentifier:CellIdentifier hasIcon:YES] autorelease];
  }

  // custom function to set the fields in the cell
  [cell setItem:[self.items objectAtIndex:indexPath.row]];  
  return cell;
}

А вот и моя упрощенная реализация SavedTableCell.h:

#import <UIKit/UIKit.h>
#import "Item.h"

@interface SavedTableCell : UITableViewCell {

  // my cell has one label and one image, but yours would have an image placed at the bottom of the cell's frame
  UILabel *primaryLabel;
  UIImageView *icon;
}

// i just made up the class Item... in my code they are actually Waypoints.
- (void) setItem:(Item*)item;


@property(nonatomic,retain) UILabel *primaryLabel;
@property(nonatomic,retain) UIImageView *icon;


@end

А вот упрощенный SavedTableCell.m:

#import "SavedTableCell.h"

@implementation SavedTableCell

@synthesize primaryLabel, icon;


- (id)initWithReuseIdentifier:(NSString *)reuseIdentifier {
  if (self = [super initWithStyle:UITableViewStylePlain reuseIdentifier:reuseIdentifier]) {
    icon = [[UIImageView alloc] initWithFrame:CGRectMake(5,5,40,40)];
    [self.contentView addSubview:icon];
    primaryLabel = [[UILabel alloc]init];
primaryLabel.font = TITLE_FONT;     
    [self.contentView addSubview:primaryLabel]; 
  } 
  return self;
}


- (void) setItem:(Item*)item {
  self.primaryLabel.text = [item name];
  [self.icon setImage:[item imageName]];
}

- (void)layoutSubviews {
  [super layoutSubviews];
  primaryLabel.frame = LABEL_FRAME;
  icon.frame = ICON_FRAME;  
}

- (void)dealloc {
  [icon release];
  [primaryLabel release];
}


@end
person Andrew Johnson    schedule 09.02.2010
comment
@Andrew: Под подклассом UITableViewCell вы имеете в виду метод cellForRowAtIndexPath ??. Также как определить дно ячейки? - person pratik; 09.02.2010
comment
@Andrew: Также вы можете подробно рассказать о том, что: Как разработчик iPhone, который прошел этот путь, я предлагаю вам по возможности избегать изображений и использовать API для создания своего приложения. - person pratik; 09.02.2010
comment
Я добавил код, который показывает, как создать собственный UITableViewCell. Если вы хотите разместить изображение внизу ячейки в качестве разделителя, просто установите его рамку соответствующим образом. Итак, если ваша ячейка таблицы была 40 пикселей в высоту и 320 пикселей в ширину, тогда рамка вашего изображения была бы CGRectMake (0,40-image-size.height, image.size.width, image.size.height); - person Andrew Johnson; 09.02.2010
comment
Под другим я подразумеваю, что нет причин создавать собственный разделитель таблиц. Просто используйте встроенную линию Apple. И всякий раз, когда вы обнаруживаете, что делаете что-то с подобными изображениями или испытываете трудности из-за того, что хотите настроить что-то встроенное, просто не делайте этого. Прежде всего, ваши пользователи хотят, чтобы ваше приложение было iPhonic ... они ожидают, что оно будет стандартным, и если этого не произойдет, ваши продажи пострадают. Во-вторых, нет лучшего способа провести время, чем попытаться настроить разделитель строк в таблице? Я сделал много подобной настройки в своем первом приложении, и это была большая ошибка. - person Andrew Johnson; 09.02.2010
comment
Я также должен предупредить вас, чтобы вы не использовали прозрачные изображения или альфа-прозрачность ни в одном из подпредставлений вашего UITableViewCell. Это сильно замедлит работу вашего приложения, особенно на телефонах 3G. - person Andrew Johnson; 09.02.2010
comment
[...] нет причин делать собственный разделитель таблиц. Неправильно. Ваш комментарий был написан в 2010 году, и с тех пор все изменилось (хотя я бы сказал, что тогда он тоже был неверным). Учитывая усилия Apple в iOS 5 и 6 для упрощения настройки пользовательского интерфейса, а также появление и популярность великолепных, сильно настраиваемых приложений, таких как TweetBot, абсолютно есть причина использовать такие элементы, как разделители ячеек таблицы, когда этого требует дизайн. - person JK Laiho; 19.09.2012
comment
Я согласен с @JKLaiho - использование изображений и прозрачных пленок в UITableViewCells больше не является проблемой. В 2010 году у людей были телефоны iPhone 3G - ни у одного из современных iPhone не будет заикания tableViews, если у вас действительно нет сложных больших изображений. Я также имел обыкновение делать такие вещи, как предварительное создание экземпляров представлений и использовать поведенческие делегаты, чтобы я мог изменять поведение классов без их повторного создания, но все эти обручи относятся к давно минувшим дням разработки iOS. - person Andrew Johnson; 20.09.2012

Решение, которое сработало для меня.

self.tableView.separatorColor = [UIColor colorWithPatternImage:[UIImage imageNamed:@"yourImage"]];
person ppolak    schedule 28.02.2012
comment
Обратите внимание, что colorWithPatternImage действительно ужасен с точки зрения использования памяти, и вам следует внимательно подумать перед его использованием. См. cocoaintheshell.com/2011/01/colorwithpatternimage-memory-usage для получения дополнительной информации. Тонкий UIImageView с изображением разделителя в настраиваемой ячейке таблицы работает нормально. - person JK Laiho; 19.09.2012

Я просто хочу добавить несколько мыслей к ответу Эндрю Джонсона.

Если вы добавите subview в contentView и используете accesoryView или изображение, тогда оно будет отображать изображение разделителя неправильно. Используйте что-нибудь вроде

UIView *bg = [[UIView alloc] initWithFrame:CGRectMake(5, 5, 40, 40)];
    bg.backgroundColor = [[UIColor redColor] colorWithAlphaComponent:0.2];
                    //or [UIColor colorWithImagePattern];
                    //or crete UIImageView and assign to backgroundView of the cell
self.backgroundView = bg;
[bg release];
person Alexander    schedule 18.01.2012