IOS: как сделать тень для UIView на 4 стороне (сверху, справа, внизу и слева)
Я использую следующий код, чтобы сделать тень для моего ImageView
UIBezierPath *shadowPath = [UIBezierPath bezierPathWithRect:self.avatarImageView.bounds];
self.avatarImageView.layer.masksToBounds = NO;
self.avatarImageView.layer.shadowColor = [UIColor blackColor].CGColor;
self.avatarImageView.layer.shadowOffset = CGSizeMake(5.0f, 5.0f);
self.avatarImageView.layer.shadowOpacity = 0.8f;
self.avatarImageView.layer.shadowPath = shadowPath.CGPath;
Он поместит тень справа и внизу, как это изображение.
![введите описание изображения здесь]()
Теперь я хочу, чтобы мой ImageView
также имел тень сверху и снизу.
Что я должен изменить в коде?
Возможно ли, чтобы представление содержало тень сверху, справа, внизу, слева от конфигурации только в коде или мне нужно создать другое представление макета для тени? Любая помощь будет оценена по достоинству.
Вот что я хочу достичь
![введите описание изображения здесь]()
Обновление
Спасибо @Dipen Panchasara за то, что вы дали простое решение. Следуйте @Dipen Panchasara (с теневым цветом черный) У меня будет теневое изображение, подобное этому
![введите описание изображения здесь]()
Ответы
Ответ 1
Вот так:
float shadowSize = 10.0f;
UIBezierPath *shadowPath = [UIBezierPath bezierPathWithRect:CGRectMake(self.avatarImageView.frame.origin.x - shadowSize / 2,
self.avatarImageView.frame.origin.y - shadowSize / 2,
self.avatarImageView.frame.size.width + shadowSize,
self.avatarImageView.frame.size.height + shadowSize)];
self.avatarImageView.layer.masksToBounds = NO;
self.avatarImageView.layer.shadowColor = [UIColor blackColor].CGColor;
self.avatarImageView.layer.shadowOffset = CGSizeMake(0.0f, 0.0f);
self.avatarImageView.layer.shadowOpacity = 0.8f;
self.avatarImageView.layer.shadowPath = shadowPath.CGPath;
версия Swift 3:
let shadowSize : CGFloat = 5.0
let shadowPath = UIBezierPath(rect: CGRect(x: -shadowSize / 2,
y: -shadowSize / 2,
width: self.avatarImageView.frame.size.width + shadowSize,
height: self.avatarImageView.frame.size.height + shadowSize))
self.avatarImageView.layer.masksToBounds = false
self.avatarImageView.layer.shadowColor = UIColor.black.cgColor
self.avatarImageView.layer.shadowOffset = CGSize(width: 0.0, height: 0.0)
self.avatarImageView.layer.shadowOpacity = 0.5
self.avatarImageView.layer.shadowPath = shadowPath.cgPath
Ответ 2
Только следующий код выполнит задание для вашего требования, вам не нужно создавать UIBezierPath
для теневого пути.
// *** Set masks bounds to NO to display shadow visible ***
self.avatarImageView.layer.masksToBounds = NO;
// *** Set light gray color as shown in sample ***
self.avatarImageView.layer.shadowColor = [UIColor lightGrayColor].CGColor;
// *** *** Use following to add Shadow top, left ***
self.avatarImageView.layer.shadowOffset = CGSizeMake(-5.0f, -5.0f);
// *** Use following to add Shadow bottom, right ***
//self.avatarImageView.layer.shadowOffset = CGSizeMake(5.0f, 5.0f);
// *** Use following to add Shadow top, left, bottom, right ***
// avatarImageView.layer.shadowOffset = CGSizeZero;
// avatarImageView.layer.shadowRadius = 5.0f;
// *** Set shadowOpacity to full (1) ***
self.avatarImageView.layer.shadowOpacity = 1.0f;
Ответ 3
Лучшее решение для тени с закругленным углом на том же виде и не нужно делать clipsToBounds или maskToBounds
func addShadow(cornerRadius: CGFloat, maskedCorners: CACornerMask, color: UIColor, offset: CGSize, opacity: Float, shadowRadius: CGFloat) {
self.layer.cornerRadius = cornerRadius
self.layer.maskedCorners = maskedCorners
self.layer.shadowColor = color.cgColor
self.layer.shadowOffset = offset
self.layer.shadowOpacity = opacity
self.layer.shadowRadius = shadowRadius
}
Ответ 4
Мало меньше кода для быстрого 3:
view.layer.shadowColor = UIColor.black.cgColor
view.layer.shadowOpacity = 0.7
view.layer.shadowOffset = CGSize.zero
view.layer.shadowRadius = 4
view.layer.shadowPath = UIBezierPath(rect: planView.bounds).cgPath
Ответ 5
Для UIView и добавления тени не забудьте установить цвет фона в UIView.
Если цвет фона - clearColor, тени не отображаются.
Ответ 6
CGRectInset (self.avatarImageView.bounds, -10.0, -10.0)
Ответ 7
//Если вы пробовали это раньше, вы точно знаете, что происходит. Углы будут закруглены, но тень будет отсутствовать. Если для masksToBounds задано значение false, тень появится, но углы не будут округлены. // чтобы получить тень с радиусом угла Добавить суперпредставление для контейнера с прозрачным цветом и применить тень для суперпредставления, применить угловой радиус для контейнера. попытайся.
//view to apply shadow and corner radius
containerView.layer.cornerRadius = 3
containerView.clipsToBounds = true
//superview of container View for to apply shadow
shadowView.layer.shadowOpacity = 0.1
shadowView.layer.shadowRadius = 2.0
shadowView.layer.masksToBounds = false
shadowView.layer.shadowOffset = CGSize.zero
shadowView.layer.shadowColor = UIColor.Black.cgColor
shadowView.layer.shadowPath = UIBezierPath(roundedRect:containerView.bounds, cornerRadius: containerView.layer.cornerRadius).cgPath
shadowView.layer.shouldRasterize = true
Ответ 8
**in swift 4**
yourView.clipsToBounds = true
yourView.layer.cornerRadius = 20
yourView.layer.shadowPath = UIBezierPath(roundedRect: self.yourView.bounds,
cornerRadius: self.DeletConversation.layer.cornerRadius).cgPath
yourView.layer.shadowColor = UIColor(hexString: "color")?.cgColor
DeletConversation.layer.shadowOpacity = 1
DeletConversation.layer.shadowOffset = CGSize(width: 0, height: 1.0)
DeletConversation.layer.shadowRadius = 1
DeletConversation.layer.masksToBounds = false
Ответ 9
Если вы все еще не получаете правильную тень, проблема может быть в том месте, куда вы добавили код. Вы должны вызвать это в viewDidLayoutSubviews. Если вы вызываете ViewDidLoad, вы можете получить неправильный результат, так как процесс макета представлений может быть незавершенным.
override func viewDidLayoutSubviews() {
super.viewDidLayoutSubviews()
//Shadow code here
}