简体   繁体   English

如何在Objective-C的UitableView中使UITableViewRowAction完全透明

[英]How to make UITableViewRowAction Completely Transparent in UitableView in Objective-C

I want to make UITableViewRowAction transparent and my background view should be visible on swipe my UITableViewCell left in Objective-C. 我想使UITableViewRowAction透明,并且在我的Objective-C中的UITableViewCell滑动时,背景视图应该可见。 I've cleared all background colors but still getting a light gray color in the background. 我清除了所有背景颜色,但背景中仍然出现浅灰色。

Here is my Code: 这是我的代码:

ViewController.h ViewController.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

ViewController.m ViewController.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 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 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

And here is my Result: 这是我的结果:

在此处输入图片说明

On Swiping second time on the same tableview cell I'm getting the expected result but not in the first time of swiping. 在同一表视图单元格上第二次滑动时,我得到了预期的结果,但第一次滑动时却没有。

Can anybody help me to resolvr it ? 有人可以帮我解决吗?

Hope this helps you! 希望这对您有所帮助!

- (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];  
}

If you set clear color means its showing light gray color.Instead of clear color you can set SampleBg image.From image you can get same tableview background color Try below code.It will work 如果您将透明色设置为浅灰色,则可以设置SampleBg图像,而不是透明色,可以从图像中获得相同的表格背景色,请尝试下面的代码。

- (NSArray<UITableViewRowAction *> *)tableView: (UITableView *)tableView editActionsForRowAtIndexPath: (NSIndexPath *)indexPath
{

    UITableViewRowAction *rowAction = [UITableViewRowAction rowActionWithStyle:UITableViewRowActionStyleNormal title:@"Delete" handler:^(UITableViewRowAction * _Nonnull action, NSIndexPath * _Nonnull indexPath) {

        NSLog(@"rowAction Performed !!");
    }];
    UIGraphicsBeginImageContext(self.view.frame.size);
    [[UIImage imageNamed:@"SampleBg"] drawInRect:self.view.bounds];
    UIImage *image = UIGraphicsGetImageFromCurrentImageContext();
    UIGraphicsEndImageContext();
    rowAction.backgroundColor = [UIColor colorWithPatternImage:image];
    return @[rowAction];
}

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM