ios 拖动单元格时如何在UITableViewCell中隐藏阴影

twh00eeo  于 2023-01-10  发布在  iOS
关注(0)|答案(9)|浏览(463)

我的UITableView中有隐藏的分隔线,当我拖动单元格时,阴影会出现在上下边框中。如何隐藏它?请看示例:

非常感谢!

lstz6jyr

lstz6jyr1#

所以,我有答案,只是UITableView的子类与方法:

- (void) didAddSubview:(UIView *)subview
{
    [super didAddSubview:subview];

    if([subview.class.description isEqualToString:@"UIShadowView"]) {
        subview.hidden = YES;
    }
}
qlvxas9a

qlvxas9a2#

无阴影表格视图.m

#import "NoShadowTableView.h"

@interface NoShadowTableView ()
{
    //  iOS7
    __weak UIView* wrapperView;
}

@end

@implementation NoShadowTableView

- (void) didAddSubview:(UIView *)subview
{
    [super didAddSubview:subview];

    //  iOS7
    if(wrapperView == nil && [[[subview class] description] isEqualToString:@"UITableViewWrapperView"])
        wrapperView = subview;

    //  iOS6
    if([[[subview class] description] isEqualToString:@"UIShadowView"])
        [subview setHidden:YES];
}

- (void) layoutSubviews
{
    [super layoutSubviews];

    //  iOS7
    for(UIView* subview in wrapperView.subviews)
    {
        if([[[subview class] description] isEqualToString:@"UIShadowView"])
            [subview setHidden:YES];
    }
}

@end
fcy6dtqo

fcy6dtqo3#

快速破解是子类UITableViewCell和添加方法:

override func layoutSubviews() {
        super.layoutSubviews()

        superview?.subviews.filter({ "\(type(of: $0))" == "UIShadowView" }).forEach { (sv: UIView) in
            sv.removeFromSuperview()
        }
    }
wh6knrhe

wh6knrhe4#

这个代码对我有效!

import UIKit

class NoShadowTableView: UITableView {

    override func didAddSubview(_ subview: UIView) {
        super.didAddSubview(subview)
        if "\(type(of: subview))" == "UIShadowView" {
            subview.removeFromSuperview()
        }
    }

}
yrdbyhpb

yrdbyhpb5#

我在使用默认的UITableView重排序控件时遇到了类似的问题,所以我使用了这个外部的第三方库来解决我的问题。
https://github.com/shusta/ReorderingTableViewController
希望这能帮上忙

snvhrwxg

snvhrwxg6#

Swift 3实施(删除了iOS6支持)

import UIKit

class NoShadowTableView: UITableView {

    weak var wrapperView: UIView?

    override func didAddSubview(_ subview: UIView) {
        super.didAddSubview(subview)

        if wrapperView == nil && "\(type(of: subview))" == "UITableViewWrapperView" {
            wrapperView = subview
        }
    }

    override func layoutSubviews() {
        super.layoutSubviews()

        wrapperView?.subviews.forEach({ view in
            if "\(type(of: view))" == "UIShadowView" {
                view.isHidden = true
            }
        })
    }
}
gab6jxml

gab6jxml7#

对我来说,对UISadowView的破解并不奏效。我在iOS 10上检查了解决方案。但cell类中的一行代码成功了:

override func layoutSubviews() {
    super.layoutSubviews()
    self.subviews.filter{ $0 is UIImageView }.forEach { $0.isHidden = true }
}
n3h0vuf2

n3h0vuf28#

Swift 4解决方案;使用扩展的uitableviewcontroller,因为现在阴影在表格中,并且仅在移动单元格时添加。

class UITableViewControllerEx: UITableViewController {

    override func viewWillLayoutSubviews() {
        super.viewWillLayoutSubviews()
        view.subviews.filter({ String(describing: type(of: $0)) == "UIShadowView" }).forEach { (sv: UIView) in
            sv.isHidden = true
        }
    }

}
r8xiu3jd

r8xiu3jd9#

所有其他的答案似乎都是使用私有API,这显然不是一件好事。此外,他们似乎不再工作(至少在iOS 16上)。
我发现使用UIDragPreviewParameters可以让我摆脱可怕的背景颜色,并重塑阴影以适应我的表视图单元格中的一个子视图。

-(UIDragPreviewParameters *)tableView:(UITableView *)tableView dragPreviewParametersForRowAtIndexPath:(nonnull NSIndexPath *)indexPath {
    return [self createParametersForTableView:tableView atIndexPath:indexPath];
}

-(UIDragPreviewParameters *)tableView:(UITableView *)tableView dropPreviewParametersForRowAtIndexPath:(NSIndexPath *)indexPath {
    return [self createParametersForTableView:tableView atIndexPath:indexPath];
}

-(UIDragPreviewParameters *)createParametersForTableView:(UITableView *)tableView atIndexPath:(NSIndexPath *)indexPath {
    
    // Get the selected table view cell.
    CustomCell *cell = [tableView cellForRowAtIndexPath:indexPath];
    
    // Create the dragged cell preview parameters.
    UIDragPreviewParameters *parameters = [[UIDragPreviewParameters alloc] init];
    [parameters setBackgroundColor:[UIColor clearColor]];
    [parameters setVisiblePath:[UIBezierPath bezierPathWithRoundedRect:cell.customSubView.frame cornerRadius:22.2]];
    [parameters setShadowPath:[UIBezierPath bezierPathWithRoundedRect:cell.customSubView.frame cornerRadius:22.2]];
    
    return parameters;
}

如果使用此方法,则需要实现两个委托:UITableViewDragDelegateUITableViewDropDelegate

[yourTableView setDragDelegate:self];
[yourTableView setDropDelegate:self];

拖动委托方法将允许您在拖动单元格时控制预览背景。在拖放单元格时,您需要使用拖放委托方法来避免预览背景返回到默认的白色背景。

相关问题