Я хотел бы использовать пользовательскую версию стандартного дополнительного изображения для раскрытия информации в моем UITableView. Как я могу это сделать? Я надеюсь, что подкласс UITableViewCell не нужен для чего-то такого простого.
Как я могу настроить дополнительный образ раскрытия информации в UITableViewCell?
Ответы (9)
Вам нужно будет создать собственное представление и назначить его свойству accessoryView
объекта UITableViewCell
. Что-то типа:
myCell.accessoryView = [[ UIImageView alloc ]
initWithImage:[UIImage imageNamed:@"Something" ]];
- (UITableViewCell *)tableView:(UITableView *)tView cellForRowAtIndexPath:(NSIndexPath *)indexPath
{
UIImage *indicatorImage = [UIImage imageNamed:@"Arrow.png"];
cell.accessoryView =[[[UIImageView alloc] initWithImage:indicatorImage] autorelease];
return cell;
}
хорошо, я делаю это с помощью кода, приведенного выше
Я столкнулся с той же проблемой, что и Грег - вспомогательное представление не отслеживается (если вы используете 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 ] ;
Существует хороший пример от Apple, показывающий, как используйте UIControl
для выполнения такого рода настройки AccessoryView.
Переопределение - (void)drawRect:(CGRect)rect
в UIControl - не самый простой способ, но он дает вам большую гибкость для создания красивых дополнительных представлений.
Я бы сделал это так:
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 голоса за и 2 против!
Swift 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:) для обработки действий кнопки.
Я использовал это для кнопки, но тот же метод работает для изображения раскрытия, [поскольку / пока] есть только один класс в этой ветви дерева иерархии элемента, к которому вы хотите прикоснуться.
Ах да, мой код называет это:
extension UIView {
var allSubviews: [UIView] {
return subviews.flatMap { [$0] + $0.allSubviews }
}
}
В быстрых 4 и 5
myCell.accessoryView = UIImageView(image: UIImage(named: "Something"))
ПРИМЕЧАНИЕ. НЕ устанавливайте для пользовательской ячейки тег: 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;
}
Я попробовал приведенный выше код, и, похоже, он больше не работает, возможно, из-за возраста этого сообщения, поэтому я выброшу свою строку, которая дала мне настраиваемый вид аксессуаров.
[cell setAccessoryView:[[UIImageView alloc] initWithImage:[UIImage imageNamed:@"arrowBtn"]]];
Надеюсь, кто-то сочтет это полезным.