Установить закругленные углы вида и тени - PullRequest
0 голосов
/ 15 октября 2018

Мне нужно округлить нижний левый и правый углы представления и опираться на то, что я нашел в Интернете. Я создал эту функцию внутри расширения UIview:

func setRoundedCorner(withRadius radius: CGSize, forCorners corners: UIRectCorner ) {

    let viewShape = CAShapeLayer()
    viewShape.bounds = CGRect(x: self.frame.origin.x, y: self.frame.origin.y, width: self.bounds.width, height: self.bounds.height)
    viewShape.position = self.center
    viewShape.path = UIBezierPath(roundedRect: self.bounds, byRoundingCorners: corners, cornerRadii: radius).cgPath
    self.layer.mask = viewShape

}

Теперь я столкнулся с двумя проблемами сэто решение;несмотря на то, что он отлично работает для статического вида, мой вид программно изменяет свою высоту, вызывая усечение вида;Я нашел обходной путь к этой проблеме, вспоминая каждый раз метод setRoundedCorner, но с моей точки зрения это очень неудобно;Есть ли другой способ решить эту проблему?Еще одна проблема, которую мне сложнее решить, это набор теней.Я обычно использую этот метод:

func setShadow(height: CGFloat, width: CGFloat, opacity: Float, radius: CGFloat) {
    self.layer.shadowPath = UIBezierPath(roundedRect: self.bounds, cornerRadius: self.layer.cornerRadius).cgPath
    self.layer.shadowColor = UIColor.black.cgColor
    self.layer.shadowOpacity = opacity
    self.layer.shadowOffset = CGSize(width: width, height: height)
    self.layer.cornerRadius = radius
    self.layer.masksToBounds = false
}

Вместо этого вид выглядит так, когда под ним должна быть тень:

enter image description here

Но в этой ситуации, похоже, не работает, не показывая тени вообще.Кто-нибудь может дать мне какой-нибудь совет?

Ответы [ 2 ]

0 голосов
/ 16 октября 2018

Вы можете просто добавить это расширение

extension UIView 
{ 
func dropShadow(scale: Bool = true) {
    layer.masksToBounds = false
    layer.shadowColor = UIColor.black.cgColor
    layer.shadowOpacity = 0.5
    layer.shadowOffset = CGSize(width: -1, height: 1)
    layer.shadowRadius = 1

    layer.shadowPath = UIBezierPath(rect: bounds).cgPath
    layer.shouldRasterize = true
    layer.rasterizationScale = scale ? UIScreen.main.scale : 1
}

func dropShadow(color: UIColor, opacity: Float = 0.5, offSet: CGSize, radius: CGFloat = 1, scale: Bool = true) {
    layer.masksToBounds = false
    layer.shadowColor = color.cgColor
    layer.shadowOpacity = opacity
    layer.shadowOffset = offSet
    layer.shadowRadius = radius

    layer.shadowPath = UIBezierPath(rect: self.bounds).cgPath
    layer.shouldRasterize = true
    layer.rasterizationScale = scale ? UIScreen.main.scale : 1
}


 }

После добавления вышеуказанного расширения вы можете использовать, как показано ниже

  priceview.layer.cornerRadius = 5
  priceview.dropShadow(color: UIColor.darkGray, opacity: 0.5, offSet: CGSize(width: 1, height: 1), radius: 3, scale: true)

Надеюсьэто поможет тебе.

0 голосов
/ 15 октября 2018

Здесь я делюсь с вами своей категорией для добавления углового радиуса (используя BezierPath) и в то же время поддерживаю добавление тени.

import UIKit

/// A category for all views.
extension UIView {
    /// Setups the layer of a view.
    public func setupLayer(
        cornerRadius: CGFloat = 22,
        borderWidth: CGFloat = 0,
        borderColor: UIColor = .clear,
        shadowOffSet: CGSize = CGSize(width: 0, height: 1),
        shadowColor: UIColor = UIColor(red:0, green:0, blue:0, alpha:0.15),
        shadowOpacity: Float = 1,
        shadowRadius: CGFloat = 2,
        shouldClipToBounds: Bool = false
        ) {

        self.layer.cornerRadius     = cornerRadius
        self.layer.borderWidth      = borderWidth
        self.layer.borderColor      = borderColor.cgColor
        self.layer.shadowOffset     = shadowOffSet
        self.layer.shadowColor      = shadowColor.cgColor
        self.layer.shadowOpacity    = shadowOpacity
        self.layer.shadowRadius     = shadowRadius
        self.clipsToBounds = shouldClipToBounds
    }

    /// Round the corner radius with bezier path.
    func roundCorners(_ corners: UIRectCorner, radius: CGFloat) {
        let path = UIBezierPath(roundedRect: self.bounds, byRoundingCorners: corners, cornerRadii: CGSize(width: radius, height: radius))
        let mask = CAShapeLayer()
        mask.path = path.cgPath
        self.layer.mask = mask
    }
}

Не стесняйтесь редактировать все на этом.Теперь поговорим о вашей проблеме.Кстати, этот код я использую в своих производственных проектах.Иногда вам нужно закруглить углы в ваших viewDidLayoutSubviews, viewWillLayoutSubviews.И если вы используете подкласс UIView или UITableViewCell или аналогичных классов, то вы добавляете свой код закругления углов в их draw функции.

override func draw(_ rect: CGRect) {
        super.draw(rect)
    // Round corners here...
}

enter image description here

Наконец, для настройки слоев я обычно называю это внутри ленивого объявления init моих элементов управления (например, кнопок, textFields ...).Узнайте разницу в добавлении углов, используя bezierPath и просто layer.cornerRadius.:)

Надеюсь, это поможет!

...