Проблема создания тени позади закругленного UIImageView - PullRequest
7 голосов
/ 25 июня 2011

У меня есть округленный UIImageView. Когда я добавляю тень, я теряю закругленный угол. Как получить тень с закругленным углом?

//Avatar
        CGRect rect;
        rect = CGRectMake(13, 10, 48, 48);
        avatarImageView = [[TCImageView alloc] initWithURL:[NSURL URLWithString:nil] placeholderImage:[UIImage imageNamed:@"placeholder.png"]];
        avatarImageView.frame = rect;
        avatarImageView.caching = YES;

        //Round the corners
        CALayer * layer = [avatarImageView layer];
        [layer setMasksToBounds:YES];
        [layer setCornerRadius:9.0];

        //Add a shadow
        avatarImageView.layer.shadowColor = [UIColor grayColor].CGColor;
        avatarImageView.layer.shadowOffset = CGSizeMake(0, 1);
        avatarImageView.layer.shadowOpacity = 1;
        avatarImageView.layer.shadowRadius = 9.0;
        avatarImageView.clipsToBounds = NO;

        [self.contentView addSubview: avatarImageView];

1 Ответ

17 голосов
/ 25 июня 2011

Функция, которая заставляет ваше изображение выглядеть с закругленным углом, та, которая скрывает тень: [layer setMasksToBounds: YES]. То, что вы можете сделать, поместить ваш ImageView в подпредставление UIView, которое действует как контейнер, предоставляющий тень.

Так что код может выглядеть так (я просто набрал его, но не скомпилировал)

//Avatar
CGRect rect;
rect = CGRectMake(13, 10, 48, 48);
avatarImageView = [[TCImageView alloc] initWithURL:[NSURL URLWithString:nil]   placeholderImage:[UIImage imageNamed:@"placeholder.png"]];
avatarImageView.frame = rect;
avatarImageView.caching = YES; 

//Round the corners
CALayer * layer = [avatarImageView layer];
[layer setMasksToBounds:YES];
[layer setCornerRadius:9.0];

//Add a shadow by wrapping the avatar into a container
UIView * container = [[UIView alloc] initWithFrame: rect];
avatarImageView.frame = CGRectMake(0,0,rect.size.width, rect.size.height);

// setup shadow layer and corner
container.layer.shadowColor = [UIColor grayColor].CGColor;
container.layer.shadowOffset = CGSizeMake(0, 1);
container.layer.shadowOpacity = 1;
container.layer.shadowRadius = 9.0;
container.layer.cornerRadius = 9.0;
container.clipsToBounds = NO;

// combine the views
[container addSubview: avatarImageView];
[self.contentView addSubview: container];
[container release];
...