Я хотел бы использовать пользовательскую версию стандартного аксессуара для раскрытия информации в своем UITableView. Как я могу это сделать? Я надеюсь, что подклассификация UITableViewCell не нужна для чего-то такого базового.
Как настроить изображение раскрытия аксессуаров в UITableViewCell?
Ответ 1
Вам нужно создать собственное представление и присвоить его свойству accessoryView
объекта UITableViewCell
. Что-то вроде:
myCell.accessoryView = [[ UIImageView alloc ]
initWithImage:[UIImage imageNamed:@"Something" ]];
Ответ 2
- (UITableViewCell *)tableView:(UITableView *)tView cellForRowAtIndexPath:(NSIndexPath *)indexPath
{
UIImage *indicatorImage = [UIImage imageNamed:@"Arrow.png"];
cell.accessoryView =[[[UIImageView alloc] initWithImage:indicatorImage] autorelease];
return cell;
}
Хорошо, я делаю это с помощью приведенного выше кода справки
Ответ 3
Я столкнулся с той же проблемой, что и Грег - аксессуар не отслеживает (если вы используете UIImageView)
Я решил это так:
UIImage * image = [ UIImage imageNamed:@"disclosure-button-grey.png" ] ;
UIControl * c = [ [ UIControl alloc ] initWithFrame:(CGRect){ CGPointZero, image.size } ] ;
c.layer.contents = (id)image.CGImage ;
[ c addTarget:self action:@selector( accessoryTapped: ) forControlEvents:UIControlEventTouchUpInside ] ;
cell.accessoryView = c ;
[ c release ] ;
Ответ 4
Существует хороший пример из Apple, в котором показано, как использовать UIControl
для выполнения такой настройки аксессуаров.
Переопределение - (void)drawRect:(CGRect)rect
в UIControl - это не самый простой способ, но дает вам большую гибкость для создания приятных аксессуаров.
Ответ 5
Я бы сделал это следующим образом:
UIImageView *chevronImgVw = [[UIImageView alloc] initWithImage:[UIImage imageNamed:@"chevron_accessory_vw_img.png"]];
chevronImgVw.frame = CGRectMake(cell.accessoryView.frame.origin.x, cell.accessoryView.frame.origin.y, 10, 20);
cell.accessoryView = chevronImgVw;
Пожалуйста, попробуйте это, прежде чем проголосовать! Потому что на данный момент у него есть 2 upvotes и 2 downvotes!
Ответ 6
Свифт 4 и 5:
Это сработало для меня:
class MyCell: UITableViewCell {
// boilerplate...
fileprivate func commonInit() {
// This is the button we want, just need to change the image.
accessoryType = .detailButton
}
open override func layoutSubviews() {
super.layoutSubviews()
// Grab the "detail" button to change its icon. Functionality is set in the delegate.
if let submitButton = allSubviews.compactMap({ $0 as? UIButton }).first {
submitButton.setImage(#imageLiteral(resourceName: "icons8-enter-1"), for: .normal)
}
}
// everything else...
}
Лучше всего, это позволяет мне использовать tableView (_: accessoryButtonTappedForRowWith :) для обработки действий кнопки.
Ответ 7
ПРИМЕЧАНИЕ. НЕ устанавливайте специальную ячейку для тега: 0. Этот тег зарезервирован для представления textLabel. Если вы установите теги в Xcode Storyboard, , вы должны установить теги для пользовательских представлений/ярлыков на 1 или выше.
Примечание. Пример Apple:
- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath (NSIndexPath *)indexPath
{
UITableViewCell *cell = [tableView dequeueReusableCellWithIdentifier:@"MyIdentifier"];
UILabel *label;
label = (UILabel *)[cell viewWithTag:1];
label.text = [NSString stringWithFormat:@"%d", indexPath.row];
label = (UILabel *)[cell viewWithTag:2];
label.text = [NSString stringWithFormat:@"%d", NUMBER_OF_ROWS - indexPath.row];
return cell;
}
Ответ 8
Я попробовал вышеуказанный код, и он больше не работает, возможно, из-за возраста этого сообщения, поэтому я сброшу свою линию, которая предоставила мне индивидуальный вид аксессуаров.
[cell setAccessoryView:[[UIImageView alloc] initWithImage:[UIImage imageNamed:@"arrowBtn"]]];
Надеюсь, что кто-то найдет это полезным.