ios - 如何在 Objective-C 的 UITableView 中使 UITableViewRowAction 完全透明
问题描述
我想让 UITableViewRowAction 透明,并且在 Objective-C 中向左滑动 UITableViewCell 时应该可以看到我的背景视图。我已经清除了所有背景颜色,但背景仍然是浅灰色。
这是我的代码:
视图控制器.h
#import <UIKit/UIKit.h>
@interface ViewController : UIViewController <UITableViewDelegate, UITableViewDataSource>
@property (nonatomic, strong) UITableView *MyCustomTableView;
@property (nonatomic, strong)NSArray *MyTableViewData;
@property (nonatomic, strong)UIImage *MyAppIconImage;
@end
视图控制器.m
#import "ViewController.h"
#import "MyTableViewCell.h"
static NSString *myCellID = @"myCellIdentifier";
@interface ViewController ()
@end
@implementation ViewController
@synthesize MyCustomTableView, MyTableViewData, MyAppIconImage;
- (void)viewDidLoad {
[super viewDidLoad];
UIGraphicsBeginImageContext(self.view.frame.size);
[[UIImage imageNamed:@"SampleBg"] drawInRect:self.view.bounds];
UIImage *image = UIGraphicsGetImageFromCurrentImageContext();
UIGraphicsEndImageContext();
self.view.backgroundColor = [UIColor colorWithPatternImage:image];
self.MyTableViewData = @[@{@"Title" : @"My TableView Title 1", @"Description" : @"My TableView Description 1"}, @{@"Title" : @"My TableView Title 2", @"Description" : @"My TableView Description 2"}, @{@"Title" : @"My TableView Title 3", @"Description" : @"My TableView Description 3"}, @{@"Title" : @"My TableView Title 4", @"Description" : @"My TableView Description 4"}, @{@"Title" : @"My TableView Title 5", @"Description" : @"My TableView Description 5"}, @{@"Title" : @"My TableView Title 6", @"Description" : @"My TableView Description 6"}, @{@"Title" : @"My TableView Title 7", @"Description" : @"My TableView Description 7"}, @{@"Title" : @"My TableView Title 8", @"Description" : @"My TableView Description 8"}];
UIImage *AppIconAsset = [UIImage imageNamed: [[NSBundle mainBundle].infoDictionary[@"CFBundleIcons"][@"CFBundlePrimaryIcon"][@"CFBundleIconFiles"] lastObject]];
self.MyAppIconImage = [self ResizeImage: AppIconAsset scaledToSize: CGSizeMake(36, 36)];
self.MyCustomTableView = [UITableView new];
self.MyCustomTableView.translatesAutoresizingMaskIntoConstraints = NO;
[self.view addSubview: self.MyCustomTableView];
self.MyCustomTableView.dataSource = self;
self.MyCustomTableView.delegate = self;
[self.view addConstraints: [NSLayoutConstraint constraintsWithVisualFormat:@"H:|[MyCustomTableView]|" options: 0 metrics: nil views: @{@"MyCustomTableView" : self.MyCustomTableView}]];
[self.view addConstraints: [NSLayoutConstraint constraintsWithVisualFormat:@"V:|[MyCustomTableView]|" options: 0 metrics: nil views: @{@"MyCustomTableView" : self.MyCustomTableView}]];
MyCustomTableView.backgroundColor = [UIColor clearColor];
[self.MyCustomTableView registerClass: [MyTableViewCell class].self forCellReuseIdentifier: myCellID];
self.MyCustomTableView.contentInset = UIEdgeInsetsMake(0.0f, 0.0f, 0.0f, 0.0);
self.MyCustomTableView.allowsMultipleSelectionDuringEditing = NO;
self.MyCustomTableView.alwaysBounceVertical = NO;
[self.MyCustomTableView setShowsHorizontalScrollIndicator:NO];
[self.MyCustomTableView setShowsVerticalScrollIndicator:NO];
[self.MyCustomTableView setContentOffset: self.MyCustomTableView.contentOffset animated: NO];
self.MyCustomTableView.estimatedRowHeight = 44;
self.MyCustomTableView.backgroundView = nil;
// self.MyCustomTableView.separatorStyle = UITableViewCellSeparatorStyleNone;
[self.MyCustomTableView setSeparatorColor:[UIColor blackColor]];
self.MyCustomTableView.tableFooterView = [[UIView alloc] initWithFrame: CGRectZero];
[self.MyCustomTableView.inputAccessoryView setBackgroundColor:[UIColor clearColor]];
self.MyCustomTableView.opaque = NO;
}
-(NSInteger)numberOfSectionsInTableView:(UITableView *)tableView {
return 1;
}
- (NSInteger)tableView:(UITableView *)tableView numberOfRowsInSection:(NSInteger)section {
return [self.MyTableViewData count];
}
-(UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath {
MyTableViewCell *myCell = (MyTableViewCell *)[tableView dequeueReusableCellWithIdentifier: myCellID forIndexPath: indexPath];
if (myCell == nil) {
myCell = [[MyTableViewCell alloc] initWithStyle: UITableViewCellStyleSubtitle reuseIdentifier: myCellID];
}
myCell.MyCellImageView = [UIImageView new];
myCell.MyCellImageView.translatesAutoresizingMaskIntoConstraints = NO;
[myCell.contentView addSubview: myCell.MyCellImageView];
[myCell.contentView addConstraints: [NSLayoutConstraint constraintsWithVisualFormat: @"H:|-12-[MyCellImageView(34)]" options: 0 metrics: nil views: @{@"MyCellImageView": myCell.MyCellImageView}]];
[myCell.contentView addConstraints: [NSLayoutConstraint constraintsWithVisualFormat: @"V:|-5-[MyCellImageView(34)]" options: 0 metrics: nil views: @{@"MyCellImageView": myCell.MyCellImageView}]];
myCell.MyCellImageView.image = self.MyAppIconImage;
myCell.MyCellImageView.backgroundColor = [UIColor clearColor];
myCell.MyCellImageView.contentMode = UIViewContentModeCenter;
myCell.MyCellImageView.userInteractionEnabled = NO;
myCell.MyCellImageView.clipsToBounds = YES;
myCell.MyCellImageView.layer.cornerRadius = 17;
myCell.MyCellTitleLabel = [UILabel new];
myCell.MyCellDescriptionLabel = [UILabel new];
myCell.MyCellTitleLabel.translatesAutoresizingMaskIntoConstraints = NO;
myCell.MyCellDescriptionLabel.translatesAutoresizingMaskIntoConstraints = NO;
[myCell.contentView addSubview: myCell.MyCellTitleLabel];
[myCell.contentView addSubview: myCell.MyCellDescriptionLabel];
[myCell.contentView addConstraints: [NSLayoutConstraint constraintsWithVisualFormat: @"H:[MyCellImageView]-10-[MyCellTitleLabel]-10-|" options: 0 metrics: nil views: @{@"MyCellTitleLabel" : myCell.MyCellTitleLabel, @"MyCellImageView": myCell.MyCellImageView}]];
[myCell.contentView addConstraints: [NSLayoutConstraint constraintsWithVisualFormat: @"H:[MyCellImageView]-10-[MyCellDescriptionLabel]-10-|" options: 0 metrics: nil views: @{@"MyCellDescriptionLabel" : myCell.MyCellDescriptionLabel, @"MyCellImageView": myCell.MyCellImageView}]];
[myCell.contentView addConstraints: [NSLayoutConstraint constraintsWithVisualFormat: @"V:|-10-[MyCellTitleLabel]" options: 0 metrics: nil views: @{@"MyCellTitleLabel" : myCell.MyCellTitleLabel}]];
[myCell.contentView addConstraints: [NSLayoutConstraint constraintsWithVisualFormat: @"V:[MyCellTitleLabel]-(5)-[MyCellDescriptionLabel]-10-|" options: 0 metrics: nil views: @{@"MyCellTitleLabel" : myCell.MyCellTitleLabel, @"MyCellDescriptionLabel" : myCell.MyCellDescriptionLabel}]];
myCell.MyCellTitleLabel.text = [[self.MyTableViewData objectAtIndex:indexPath.row] valueForKey: @"Title"];
myCell.MyCellDescriptionLabel.text = [[self.MyTableViewData objectAtIndex:indexPath.row] valueForKey: @"Description"];
myCell.MyCellDescriptionLabel.lineBreakMode = NSLineBreakByWordWrapping;
myCell.MyCellDescriptionLabel.numberOfLines = 0;
myCell.MyCellDescriptionLabel.textAlignment = NSTextAlignmentJustified;
myCell.MyCellDescriptionLabel.backgroundColor = [UIColor clearColor];
myCell.backgroundColor = [UIColor clearColor];
myCell.backgroundView.backgroundColor = [UIColor clearColor];
myCell.backgroundView.opaque = NO;
myCell.backgroundView = nil;
myCell.textLabel.textColor = [UIColor blackColor];
return myCell;
}
- (NSArray<UITableViewRowAction *> *)tableView: (UITableView *)tableView editActionsForRowAtIndexPath: (NSIndexPath *)indexPath
{
MyTableViewCell *myCell = [MyCustomTableView cellForRowAtIndexPath: indexPath];
[myCell.contentView layoutIfNeeded];
UITableViewRowAction *rowAction = [UITableViewRowAction rowActionWithStyle:UITableViewRowActionStyleNormal title: @"Delete" handler:^(UITableViewRowAction * _Nonnull action, NSIndexPath * _Nonnull indexPath) {
NSLog(@"rowAction Performed !!");
}];
rowAction.backgroundColor = [UIColor clearColor];
return @[rowAction];
}
- (void)tableView:(UITableView *)tableView commitEditingStyle:(UITableViewCellEditingStyle)editingStyle forRowAtIndexPath:(NSIndexPath *)indexPath {
if (editingStyle == UITableViewCellEditingStyleDelete) {
// [self.objects removeObjectAtIndex:indexPath.row];
[tableView deleteRowsAtIndexPaths:@[indexPath] withRowAnimation: UITableViewRowAnimationFade];
} else if (editingStyle == UITableViewCellEditingStyleInsert) {
// Create a new instance of the appropriate class, insert it into the array, and add a new row to the table view.
}
}
-(UIImage*)ResizeImage:(UIImage*)image scaledToSize:(CGSize)newSize {
UIGraphicsBeginImageContext( newSize );
[image drawInRect:CGRectMake(0,0,newSize.width,newSize.height)];
UIImage* newImage = UIGraphicsGetImageFromCurrentImageContext();
UIGraphicsEndImageContext();
return newImage;
}
MyTableViewCell.h
#import <UIKit/UIKit.h>
@interface MyTableViewCell : UITableViewCell
@property (nonatomic, strong) UILabel *MyCellTitleLabel;
@property (nonatomic, strong)UILabel *MyCellDescriptionLabel;
@property (nonatomic, strong)UIImageView *MyCellImageView;
@end
MyTableViewCell.m
#import "MyTableViewCell.h"
@implementation MyTableViewCell
- (void)awakeFromNib {
[super awakeFromNib];
// Initialization code
}
-(id)initWithStyle: (UITableViewCellStyle)style reuseIdentifier: (NSString *)reuseIdentifier {
self = [super initWithStyle:style reuseIdentifier: reuseIdentifier];
if (self) {
self.contentView.autoresizingMask = UIViewAutoresizingFlexibleHeight|UIViewAutoresizingFlexibleWidth;
// self.nvFullScrnPlayerDelegate = self;
}
return self;
}
- (void)prepareForReuse {
[super prepareForReuse];
for(UIView *subview in [self.contentView subviews]) {
[subview removeFromSuperview];
}
}
-(void)layoutSubviews {
[super layoutSubviews];
// for (UIView *subview in self.subviews) {
// for (UIView *subview2 in subview.subviews) {
//
////NSRange range = ;
// if ([(NSString *)subview2 rangeOfString:@"UITableViewCellActionButton"].location != NSNotFound) {
// NSLog(@"1234567890");
// }
//// if (range.location != NSNotFound) {
//// for (UIView *view in subview2.subviews) {
////
////NSRange newRange = [(NSString *)view rangeOfString: @"UIButtonLabel"];
////// if (String(view).rangeOfString("UIButtonLabel") != nil) {
////if (newRange.location != NSNotFound) {
//// UILabel *Textlabel = (UILabel *)view;
//// if (Textlabel == (UILabel *) view) {
//// Textlabel.textColor = [UIColor blackColor];
//// }
//// }
//// }
//// }
//
// }
// }
}
@end
这是我的结果:
在同一个表格视图单元格上第二次刷卡时,我得到了预期的结果,但不是在第一次刷卡时。
任何人都可以帮我解决它吗?
解决方案
希望这对你有帮助!
- (BOOL)tableView:(UITableView *)tableView canEditRowAtIndexPath:(NSIndexPath *)indexPath
{
return YES;
}
- (NSArray<UITableViewRowAction *> *)tableView:(UITableView *)tableView editActionsForRowAtIndexPath:(NSIndexPath *)indexPath
{
UITableViewRowAction *callAction = [UITableViewRowAction rowActionWithStyle:UITableViewRowActionStyleDefault title:@"Delete" handler:^(UITableViewRowAction *action, NSIndexPath *indexPath) {
NSLog(@"View Action fired");
}];
callAction.backgroundColor = [UIColor clearColor];
return @[callAction];
}
推荐阅读
- git - 在桌面目录下做 git init 有什么坏处?
- android - 在Android中,当应用程序处于运行或关闭状态时,是否有适当的方法来检测用户是否添加或删除了指纹?
- kubernetes - Kubernetes Persistent Volumes 删除初始文件
- node.js - 为什么找不到我安装的Node包
- reactjs - 如何防止 VSCode (Emmet) 扩展 TypeScript 类型定义
- python - Django 使用 Q 过滤查询
- reactjs - 在我之前渲染一次该值之后,条件无线电重新渲染不受当前状态值的影响吗?
- python - 如何将 PySpark 函数的返回类型指定为数据框?
- java - 在 Manjaro Linux 上为 React Native 运行 JDK 时出现问题
- excel - 计算同一日期的值并在新表中打印日期前面的计数