2015-04-02 2 views
26

Я сделал пользовательский UITableViewRowAction. Теперь я хотел бы добавить изображение вместо текста. Я знаю, что это возможно, но не знаю, как это сделать. Кто-нибудь из вас знает, как это сделать в Свифт и хотел бы мне помочь? Спасибо за ваши ответы!UITableViewRowAction изображение для заголовка

+0

Ответил здесь -https: //stackoverflow.com/questions/44771778/how-to-add-image-in-uitableviewrowaction/45301272#45301272 – Jack

+0

Update ответил как для прошивки 11 и более ранний https: // stackoverflow.com/questions/27740884/uitableviewrowaction-title-as-image-icon-instead-of-text/46337919#46337919 –

ответ

37

Вам нужно установить UIImage для BackgroundColor действия ряда, конкретно по:

Swift:

UIColor(patternImage: UIImage(named: "")) 

Objective-C:

[UIColor colorWithPatternImage:[UIImage imageNamed:@""]]; 
+0

Спасибо, что работает! – user3592462

+3

Для изображений я собрал CocoaPod, который попытается решить это как можно шире: https://github.com/benguild/BGTableViewRowActionWithImage –

+0

@BenGuild, спасибо –

0
delActions.backgroundColor = [UIColor colorWithPatternImage:[UIImage imageNamed:@"delete.png"]]; 
6
class TableViewRowAction: UITableViewRowAction 
{ 
    var image: UIImage? 

    func _setButton(button: UIButton) 
    { 
     if let image = image, let titleLabel = button.titleLabel 
     { 
      let labelString = NSString(string: titleLabel.text!) 
      let titleSize = labelString.sizeWithAttributes([NSFontAttributeName: titleLabel.font]) 

      button.tintColor = UIColor.whiteColor() 
      button.setImage(image.imageWithRenderingMode(.AlwaysTemplate), forState: .Normal) 
      button.imageEdgeInsets.right = -titleSize.width 
     } 
    } 
} 


func tableView(tableView: UITableView, editActionsForRowAtIndexPath indexPath: NSIndexPath) -> [UITableViewRowAction]? 
{ 
    let delete = TableViewRowAction(style: UITableViewRowActionStyle.Default, title: "   ") { action, indexPath in } 
    delete.image = UIImage(named: "trashImg") 

    let sharing = TableViewRowAction(style: UITableViewRowActionStyle.Default, title: "   ") { action, indexPath in } 
    sharing.backgroundColor = UIColor.lightGrayColor() 
    sharing.image = UIImage(named: "sharingImg") 

    return [delete, sharing] 
} 
+0

FYI это не позволит вам просто добавить изображение, также должен быть текст. Он разбился, когда я положил «» в аргумент title (из-за разворота силы titleLabel.text). Я должен был поместить «» в аргумент title, чтобы получить изображение только для салфетки ... на стороне плюса вы можете управлять шириной кнопки с количеством пробелов, хотя ... :) – Natalia

+1

@Jayesh Miruriya, how вы знали, что UITableViewRowAction имеет свойство кнопки? Это НЕ в документации: https://developer.apple.com/reference/uikit/uitableviewrowaction. Это технически взломать? – etayluz

+0

не работает в iOS 8.4 :( – Jenny

0

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

мне пришлось иметь дело с динамической высотой ячеек, так я реализовал следующие:

- (UIColor *)backgroundImageForActionAtIndexPath:(NSIndexPath *)indexPath withImage:(UIImage *)image tintColor:(UIColor *)tintColor backgroundColor:(UIColor *)backgrounfColor expectedWith:(CGFloat)width { 
// 
CGRect cellFrame = [self.tableView rectForRowAtIndexPath:indexPath]; 
CGSize expectedSize = CGSizeMake(width, cellFrame.size.height); 

UIGraphicsBeginImageContextWithOptions(expectedSize, NO, 0.0); 

CGContextRef ctx = UIGraphicsGetCurrentContext(); 
if (ctx) { 
    // set the background 
    CGContextSetFillColorWithColor(ctx, backgrounfColor.CGColor); 
    CGRect fillRect = CGRectZero; 
    fillRect.size = expectedSize; 
    CGContextFillRect(ctx, fillRect); 
    // put the image 
    CGContextSetFillColorWithColor(ctx, tintColor.CGColor); 
    CGRect rect = CGRectMake((expectedSize.width - image.size.width)/2., (expectedSize.height - image.size.height)/2., image.size.width, image.size.height); 
    [image drawInRect:rect]; 
} 

UIImage * newImage = UIGraphicsGetImageFromCurrentImageContext(); 
UIGraphicsEndImageContext(); 

return [UIColor colorWithPatternImage:newImage]; 

}

Вы все еще должны установить expectedWidth так, что он соответствует пустой ярлык вы положили в названии данного действия , например: @ "" -> 64.f

Как вы видите при таком подходе вы можете установить цвет фона кнопки и цвет в коде, а не в самом художественном произведении.

1

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

extension UITableViewRowAction { 

    func setIcon(iconImage: UIImage, backColor: UIColor, cellHeight: CGFloat, iconSizePercentage: CGFloat) 
    { 
    let iconHeight = cellHeight * iconSizePercentage 
    let margin = (cellHeight - iconHeight)/2 as CGFloat 

    UIGraphicsBeginImageContextWithOptions(CGSize(width: cellHeight, height: cellHeight), false, 0) 
    let context = UIGraphicsGetCurrentContext() 

    backColor.setFill() 
    context!.fill(CGRect(x:0, y:0, width:cellHeight, height:cellHeight)) 

    iconImage.draw(in: CGRect(x: margin, y: margin, width: iconHeight, height: iconHeight)) 

    let actionImage = UIGraphicsGetImageFromCurrentImageContext(); 
    UIGraphicsEndImageContext(); 

    self.backgroundColor = UIColor.init(patternImage: actionImage!) 
    } 
}