Слой теней не изменяется при изменении кадра UIView - PullRequest
0 голосов
/ 28 апреля 2018

Снимок экрана с изображением

class ViewController: UIViewController {
    var shadow : UIView!
    override func viewDidLoad() {
        super.viewDidLoad()
        shadow = UIView(frame: CGRect(x: 50,y: 50,width: 150,height:150))
        shadow.backgroundColor = .red
        shadow.dropShadow()
        self.view.addSubview(shadow)

    }

    @IBAction func btnActn(_ sender: Any) {self.shadow.frame = CGRect(x: 50,y: 50,width: 150,height: 50)

    }

}

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 = 2
        layer.shadowPath = UIBezierPath(rect: bounds).cgPath
        layer.shouldRasterize = true
        layer.rasterizationScale = scale ? UIScreen.main.scale : 1
    }

}

Слой теней не изменяется при изменении кадра UIView, как изменить его размер в соответствии с размером кадра, это весь мой код UIviewcontroller

Ответы [ 3 ]

0 голосов
/ 28 апреля 2018

У вас есть много способов сделать это:

Первый: В методе 'viewWillLayoutSubviews' вы должны вызывать свой теневой метод следующим образом. поэтому, когда вы меняете кадр, вам не нужно беспокоиться о слоях. Этот метод автоматически вызывает каждый раз, когда вы изменили представление: -

override func viewWillLayoutSubviews() {
    shadow.dropShadow()
}

Секунда: Когда вы собираетесь перекадрировать свой размер просмотра, вам необходимо установить «true» для «autoresizesSubviews», например:

@IBAction func btnActn(_ sender: Any) {
        self.shadow.frame = CGRect(x: 50,y: 50,width: 150,height: 50)
        self.shadow.autoresizesSubviews = true
    }
0 голосов
/ 28 апреля 2018
Before calling dropShadow, first, try to call layoutIfNeeded

        @IBAction func btnActn(_ sender: Any) {
          self.shadow.frame = CGRect(x: 50,y: 50,width: 150,height: 50)
          self.shadow.layoutIfNeeded()
          self.shadow.dropShadow()
        }
0 голосов
/ 28 апреля 2018

Проблема в том, что вы рисуете тень только один раз, когда viewcontroller загружен в память, в viewDidLoad(). Вам нужно вызывать dropShadow каждый раз, когда вы перерисовываете представление, с которым он связан.

Этого можно добиться, позвонив dropShadow после изменения кадра shadow.

@IBAction func btnActn(_ sender: Any) {
    self.shadow.frame = CGRect(x: 50,y: 50,width: 150,height: 50)
    self.shadow.dropShadow()
}
...