Как сделать собственный шрифт и цвет в UITableViewRowAction без раскадровки
У меня есть классический TableView, где вы можете удалить элемент, если вы проведите пальцем по кнопке. Я знаю, как установить пользовательский фон в ячейке, но я не могу найти, как я могу установить для него собственный шрифт и цвет.
Благодарим вас за помощь!
func tableView(tableView: UITableView, editActionsForRowAtIndexPath indexPath: NSIndexPath) -> [AnyObject]? {
var deleteAction = UITableViewRowAction(style: UITableViewRowActionStyle.Default,
title: "Delete",
handler: {
(action:UITableViewRowAction!, indexPath:NSIndexPath!) -> Void in
println("Delete button clicked!")
})
deleteAction.backgroundColor = UIColor.redColor()
return [deleteAction]
}
Ответы
Ответ 1
Как использовать пользовательский шрифт?
Это довольно легко.
- Во-первых, вам нужно включить ваши собственные файлы шрифтов в свой проект.
- Затем перейдите в файл info.plist и добавьте новую запись с ключом " шрифты, предоставленные приложением". Обратите внимание, что эта запись должна быть массивом.
- Затем добавьте имена этих файлов в качестве элементов этого массива.
И это! Все, что вам нужно, это использовать шрифт по его названию, как этот
cell.textLabel.font = [UIFont fontWithName:@"FontName" size:16];
Как изменить цвет шрифта?
Еще проще. Все, что вам нужно, это
cell.textlabel.textcolor = UIColor.redColor()
Изменить:
В вашем случае вы хотите изменить шрифт RowAction. Поэтому я думаю только о двух решениях. Для использования [UIColor colorWithPatterImage:]
Или вы можете пользователь [[UIButton appearance] setTitleColor:[UIColor orangeColor] forState:UIControlStateNormal];
, потому что RowAction содержит кнопку.
Ответ 2
Ну, единственный способ установить собственный шрифт - использовать метод appearanceWhenContainedIn
протокола UIAppearance
. Этот метод еще не доступен в Swift, поэтому вам нужно сделать это в Objective-C.
Я создал метод класса в классе Objective-C для его настройки:
+ (void)setUpDeleteRowActionStyleForUserCell {
UIFont *font = [UIFont fontWithName:@"AvenirNext-Regular" size:19];
NSDictionary *attributes = @{NSFontAttributeName: font,
NSForegroundColorAttributeName: [UIColor whiteColor]};
NSAttributedString *attributedTitle = [[NSAttributedString alloc] initWithString: @"DELETE"
attributes: attributes];
/*
* We include UIView in the containment hierarchy because there is another button in UserCell that is a direct descendant of UserCell that we don't want this to affect.
*/
[[UIButton appearanceWhenContainedIn:[UIView class], [UserCell class], nil] setAttributedTitle: attributedTitle
forState: UIControlStateNormal];
}
Это работает, но это определенно не идеально. Если вы не включаете UIView в иерархию сдерживания, то это также влияет на индикатор раскрытия (я даже не понял, что индикатор раскрытия информации был подклассом UIButton). Кроме того, если у вас есть UIButton в вашей ячейке, которая находится внутри подвью в ячейке, тогда эта кнопка также будет затронута этим решением.
Учитывая осложнения, лучше всего использовать одну из более настраиваемых библиотек с открытым исходным кодом для вариантов прокрутки ячейки таблицы.
Ответ 3
Если вы используете XCode Debug View Hierarchy, чтобы посмотреть, что происходит в UITableView, когда кнопки салфетки активны, вы увидите, что элементы UITableViewRowAction переходят на кнопку с именем _UITableViewCellActionButton
, содержащуюся в UITableViewCellDeleteConfirmationView
. Один из способов изменить свойства кнопок - это перехват, когда он добавлен в UITableViewCell
. В вашем производном классе UITableViewCell
напишите что-то вроде этого:
private let buttonFont = UIFont.boldSystemFontOfSize(13)
private let confirmationClass: AnyClass = NSClassFromString("UITableViewCellDeleteConfirmationView")!
override func addSubview(view: UIView) {
super.addSubview(view)
// replace default font in swipe buttons
let s = subviews.flatMap({$0}).filter { $0.isKindOfClass(confirmationClass) }
for sub in s {
for button in sub.subviews {
if let b = button as? UIButton {
b.titleLabel?.font = buttonFont
}
}
}
}
Ответ 4
Я хочу поделиться своим решением для ObjC, это всего лишь трюк, но работает как ожидается для меня.
- (NSArray<UITableViewRowAction *> *)tableView:(UITableView *)tableView editActionsForRowAtIndexPath:(NSIndexPath *)indexPath
{
// this just convert view to `UIImage`
UIImage *(^imageWithView)(UIView *) = ^(UIView *view) {
UIGraphicsBeginImageContextWithOptions(view.bounds.size, view.opaque, 0.0);
[view.layer renderInContext:UIGraphicsGetCurrentContext()];
UIImage *image = UIGraphicsGetImageFromCurrentImageContext();
UIGraphicsEndImageContext();
return image;
};
// This is where the magic happen,
// The width and height must be dynamic (it up to you how to implement it)
// to keep the alignment of the label in place
//
UIColor *(^getColorWithLabelText)(NSString*, UIColor*, UIColor*) = ^(NSString *text, UIColor *textColor, UIColor *bgColor) {
UILabel *lbDelete = [[UILabel alloc] initWithFrame:CGRectMake(0, 0, 47, 40)];
lbDelete.font = [UIFont boldSystemFontOfSize:11];
lbDelete.text = text;
lbDelete.textAlignment = NSTextAlignmentCenter;
lbDelete.textColor = textColor;
lbDelete.backgroundColor = bgColor;
return [UIColor colorWithPatternImage:imageWithView(lbDelete)];
};
// The `title` which is `@" "` is important it
// gives you the space you needed for the
// custom label `47[estimated width], 40[cell height]` on this example
//
UITableViewRowAction *btDelete;
btDelete = [UITableViewRowAction
rowActionWithStyle:UITableViewRowActionStyleDestructive
title:@" "
handler:^(UITableViewRowAction * _Nonnull action, NSIndexPath * _Nonnull indexPath) {
NSLog(@"Delete");
[tableView setEditing:NO];
}];
// Implementation
//
btDelete.backgroundColor = getColorWithLabelText(@"Delete", [UIColor whiteColor], [YJColor colorWithHexString:@"fe0a09"]);
UITableViewRowAction *btMore;
btMore = [UITableViewRowAction
rowActionWithStyle:UITableViewRowActionStyleNormal
title:@" "
handler:^(UITableViewRowAction * _Nonnull action, NSIndexPath * _Nonnull indexPath) {
NSLog(@"More");
[tableView setEditing:NO];
}];
// Implementation
//
btMore.backgroundColor = getColorWithLabelText(@"More", [UIColor darkGrayColor], [YJColor colorWithHexString:@"46aae8"]);
return @[btMore, btDelete];
}
[YJColor colorWithHexString:<NSString>];
- это просто преобразовать шестнадцатеричную строку в UIColor.
Проверьте примерный снимок экрана.
Ответ 5
Кажется, что это работает, по крайней мере, для установки цвета шрифта:
- (void)setupRowActionStyleForTableViewSwipes {
UIButton *appearanceButton = [UIButton appearanceWhenContainedInInstancesOfClasses:@[[NSClassFromString(@"UITableViewCellDeleteConfirmationView") class]]];
[appearanceButton setTitleColor:[UIColor lightGrayColor] forState:UIControlStateNormal];
}
Ответ 6
Вы можете использовать UIButton.appearance
для UIButton.appearance
кнопки внутри действия строки. Вот так:
let buttonStyle = UIButton.appearance(whenContainedInInstancesOf: [YourViewController.self])
let font = UIFont(name: "Custom-Font-Name", size: 16.0)!
let string = NSAttributedString(string: "BUTTON TITLE", attributes: [NSAttributedString.Key.font : font, NSAttributedString.Key.foregroundColor : UIColor.green])
buttonStyle.setAttributedTitle(string, for: .normal)
Примечание: это повлияет на все ваши кнопки в этом контроллере представления.
Ответ 7
Вот какой Swift-код может быть полезен:
func tableView(tableView: UITableView, editActionsForRowAtIndexPath indexPath: NSIndexPath) ->[AnyObject]? {
let attributes = [NSFontAttributeName: UIFont.systemFontOfSize(UIFont.systemFontSize())] as Dictionary!
UIButton.appearance().setAttributedTitle(NSAttributedString(string: "Your Button", attributes: attributes), forState: .Normal)
// Things you do...
}
Это будет управлять всеми кнопками в вашем приложении.
Ответ 8
Я думаю, вы можете использовать этот метод для изменения внешнего вида только в одном (или более, вы можете определить его) viewcontrollers:
//create your attributes however you want to
let attributes = [NSFontAttributeName: UIFont.systemFontOfSize(UIFont.systemFontSize())] as Dictionary!
//Add more view controller types in the []
UIButton.appearanceWhenContainedInInstancesOfClasses([ViewController.self])
Надеюсь, что это помогло.
Ответ 9
//The following code is in Swift3.1
func tableView(_ tableView: UITableView, editActionsForRowAt indexPath: IndexPath) -> [UITableViewRowAction]?
{
let rejectAction = TableViewRowAction(style: UITableViewRowActionStyle.default, title: "\u{2715}\nReject") { action, indexPath in
print("didtapReject")
}
rejectAction.backgroundColor = UIColor.gray
let approveAction = TableViewRowAction(style: UITableViewRowActionStyle.default, title: "\u{2713}\nApprove") { action, indexPath in
print("didtapApprove")
}
approveAction.backgroundColor = UIColor.orange
return [rejectAction, approveAction]
}