Я подправил модификацию, сделанную @anoop4real, используя clear как toColor
, и сделал интерфейс более соответствующим настройкам теней в CALayer, включая значения по умолчанию, за исключением непрозрачности, которая по умолчанию установлена на 0,0. Я выбрал значение по умолчанию 0,6, так как оно выглядело наиболее естественным.
extension UIView {
func addShadow(to edges: [UIRectEdge], radius: CGFloat = 3.0, opacity: Float = 0.6, color: CGColor = UIColor.black.cgColor) {
let fromColor = color
let toColor = UIColor.clear.cgColor
let viewFrame = self.frame
for edge in edges {
let gradientLayer = CAGradientLayer()
gradientLayer.colors = [fromColor, toColor]
gradientLayer.opacity = opacity
switch edge {
case .top:
gradientLayer.startPoint = CGPoint(x: 0.5, y: 0.0)
gradientLayer.endPoint = CGPoint(x: 0.5, y: 1.0)
gradientLayer.frame = CGRect(x: 0.0, y: 0.0, width: viewFrame.width, height: radius)
case .bottom:
gradientLayer.startPoint = CGPoint(x: 0.5, y: 1.0)
gradientLayer.endPoint = CGPoint(x: 0.5, y: 0.0)
gradientLayer.frame = CGRect(x: 0.0, y: viewFrame.height - radius, width: viewFrame.width, height: radius)
case .left:
gradientLayer.startPoint = CGPoint(x: 0.0, y: 0.5)
gradientLayer.endPoint = CGPoint(x: 1.0, y: 0.5)
gradientLayer.frame = CGRect(x: 0.0, y: 0.0, width: radius, height: viewFrame.height)
case .right:
gradientLayer.startPoint = CGPoint(x: 1.0, y: 0.5)
gradientLayer.endPoint = CGPoint(x: 0.0, y: 0.5)
gradientLayer.frame = CGRect(x: viewFrame.width - radius, y: 0.0, width: radius, height: viewFrame.height)
default:
break
}
self.layer.addSublayer(gradientLayer)
}
}
func removeAllShadows() {
if let sublayers = self.layer.sublayers, !sublayers.isEmpty {
for sublayer in sublayers {
sublayer.removeFromSuperlayer()
}
}
}
}
Верхний вид — это настройки по умолчанию, а нижний использует радиус 5,0, чтобы показать более четко.
view1.addShadow([.top, .bottom, .left, .right])
view2.addShadow([.top, .bottom, .left, .right], radius: 5.0)
view2.backgroundColor = .orange
![виды с внутренней тенью](https://i.stack.imgur.com/e8E17.png)
person
Lou Valencia
schedule
04.04.2019
CGSizeMake
, поэтому я хотел спросить об этом. Я просто искал более быстрый способ - person senty   schedule 07.06.2016UIImageView
в качестве дочернего представления, приклеенного к верхней границе и растянутого по всей ширине. Если вам нужна специальная обработка боковых краев (как, кажется, предполагает ваш скриншот), возможно, растягиваемое изображение со вставками поможет. - person Nicolas Miari   schedule 07.06.2016drawRect(_:)
и сделать все с Core Graphics. Никаких посторонних дополнительных представлений, никаких графических ресурсов, но более продвинутый код. - person Nicolas Miari   schedule 07.06.2016