web-dev-qa-db-ja.com

UITableViewにドロップシャドウを追加する

左と右にドロップシャドウを追加したいプレーンなUITableView(グループ化されていない)があります。

enter image description here

どうすればこれを達成できますか?私はもう試した:

[self.tableView.layer setShadowColor:[[UIColor whiteColor] CGColor]];
[self.tableView.layer setShadowOffset:CGSizeMake(0, 0)];
[self.tableView.layer setShadowRadius:5.0];
[self.tableView.layer setShadowOpacity:1];

しかし、それは機能しません。

16
Fred Collins

ビューとレイヤーでclipsToBoundsmasksToBoundsがそれぞれNOに設定されていることを確認する必要があります。

self.tableView.clipsToBounds = NO;
self.tableView.layer.masksToBounds = NO;
51
mattjgalloway

私のソリューションを共有したいと思います。これには、UITableViewをサブクラス化し、プロパティを追加する必要があります。デモンストレーションのために、showShadowと呼びましょう。これをテーブルビューの.hファイルに追加します。

@property (nonatomic,assign) BOOL showShadow;

.mファイル内の対応する@synthesizeは、getterメソッドとsetterメソッドを作成します。

_@synthesize showShadow;_

次に、iVar _UIView *shadowView;_をテーブルビューの.hファイルに追加します。次に、サブクラス化されたUITableViewの- (id)initWithFrame:(CGRect)frameメソッドに次のコードを追加して、最終的に影を落とすビューを設定します。

_- (id)initWithFrame:(CGRect)frame
{
    self = [super initWithFrame:frame];
    if (self) {

        shadowView = [[UIView alloc]initWithFrame:self.frame];
        shadowView.backgroundColor = [UIColor whiteColor];
        shadowView.layer.shadowOpacity = 0.1;
        shadowView.layer.shadowOffset = CGSizeMake(3, 3);
        shadowView.layer.shadowRadius = 1;



    }
    return self;
}
_

そして最後に、影を表示/非表示にするsetterメソッドを記述します。

_-(void)setShowShadow:(BOOL)s{

    showShadow = s;

    if(s){
        [self.superview insertSubview:shadowView belowSubview:self];
    }else{
        [shadowView removeFromSuperview];
    }
}
_

さらに、(何らかの理由で)テーブルを移動する場合は、_-setFrame:_メソッドをオーバーライドして、shadowViewも一緒に移動する必要があります(テーブルビューのビュー階層にはないため)。

_-(void)setFrame:(CGRect)frame{

     [super setFrame:frame];
     shadowView.frame = frame;

}
_

シャドウが正常に有効になりました。このように使用してください:

_MySubclassedTableView *table = [[MySubclassedTableView alloc]initWithFrame:CGRectMake(20, 200, 280, 200)];
        [self.view addSubview:table];
        table.showShadow = YES;
_

警告:

ShowShadowプロパティを設定する必要があります[〜#〜] after [〜#〜]行table.showShadowが行[self.superview insertSubview:shadowView belowSubview:を呼び出すため、テーブルビューを追加します。自己];これには、テーブルビューが存在する必要があります。

6
the_critic

影が見える白い輝きではないですか?オフセットが設定されていないため、目的どおりに実行されます。シャドウの場合は、色を黒に設定し、オフセットを3,5程度にします。

0
Jeshua Lacock