丸くすると影がつかない。
影をつけると丸くできない
QuartzCoreを使えば
CALayerのshadowとcornerRadiusを変更できるが、同時には適用できない。
角丸を有効にするためにsetMasksToBoundsをYESにすると、
shadowが無視されるようだ。
なので、影用のlayerを別に用意することにした。
TKImageView.h
/*********************************************************************/
/* interface */
/*********************************************************************/
@interface TKImageView : UIView {
UIImageView *contentsView;
CALayer *shadow;
}
- (void)setImage:(UIImage *)image;
@end
TKImageView.m
#define CornerRadius 3
/*********************************************************************/
/* private interface */
/*********************************************************************/
@interface TKImageView(private)
@property(nonatomic, readonly)UIImageView *contentsView;
@property(nonatomic, readonly)CALayer *shadow;
@end
/*********************************************************************/
/* implmentation */
/*********************************************************************/
@implementation TKImageView
#pragma mark -
- (void)dealloc {
[contentsView release];
[shadow release];
[super dealloc];
}
- (void)layoutSubviews {
[self.contentsView setFrame:self.bounds];
[self.shadow setFrame:self.layer.bounds];
}
#pragma mark -
- (void)setImage:(UIImage *)image {
[self.contentsView setImage:image];
}
@end
/*********************************************************************/
/* private implementation */
/*********************************************************************/
@implementation TKImageView(private)
#pragma mark - property
@dynamic contentsView;
@dynamic shadow;
- (UIImageView *)contentsView {
if (contentsView) return contentsView;
contentsView = [[UIImageView alloc] init];
[contentsView setBackgroundColor:[UIColor blackColor]];
[contentsView.layer setMasksToBounds:YES];
[contentsView.layer setCornerRadius:CornerRadius];
[self addSubview:contentsView];
return contentsView;
}
- (CALayer *)shadow {
if (shadow) return shadow;
shadow = [[CALayer alloc] init];
[shadow setBackgroundColor:[UIColor blackColor].CGColor];
[shadow setCornerRadius:CornerRadius];
[shadow setShadowColor:[[UIColor blackColor] CGColor]];
[shadow setShadowRadius:1.0f];
[shadow setShadowOffset:CGSizeMake(1.5f, 2.3f)];
[shadow setShadowOpacity:0.7f];
[self.layer insertSublayer:shadow
below:self.contentsView.layer
];
return shadow;
}
@end