Я пытаюсь создать тень на всех четырех сторонах моего UIView в моем ViewController - что отлично работает, пока я не добавлю ограничения к UIView через Xcode. Как сделать тень от UIView отображаемой со всех четырех сторон с заданными ограничениями для всех сторон?
По сути, я обнаружил, что всякий раз, когда я применяю ограничения через Xcode к UIView, вокруг которого я установил тень, тень не появляется под всеми четырьмя сторонами UIView. Вместо этого он перемещается влево, оставляя правую и нижнюю стороны полностью без тени. Это видно на скриншотах ниже.
class RegistrationViewController: UIViewController {
@IBOutlet weak var signUpView: UIView!
override func viewDidLoad() {
super.viewDidLoad()
signUpView.clipsToBounds = true
signUpView.layer.cornerRadius = 20;
signUpView.layer.shadowPath = UIBezierPath(roundedRect: signUpView.bounds, cornerRadius: signUpView.layer.cornerRadius).cgPath
signUpView.layer.shouldRasterize = true
signUpView.layer.shadowColor = UIColor.black.cgColor
signUpView.layer.shadowOffset = .zero
signUpView.layer.shadowOpacity = 1
signUpView.layer.shadowRadius = 20
signUpView.layer.masksToBounds = false
// Do any additional setup after loading the view.
}
}
Почему это происходит и как добавить ограничения, сохранив желаемый результат?





В viewDidLoad ваши ограничения еще не повлияли. Поэтому, когда вы создаете свой UIBezierPath, границы не обновляются до ограничений автоматического макета. Используемые границы, вероятно, совпадают с границами вашего файла .xib.
Переместите свой shadowMakingPath в viewDidLayoutSubviews
override func viewDidLayoutSubviews() {
super.viewDidLayoutSubivews()
signUpView.layer.shadowPath = UIBezierPath(roundedRect: signUpView.bounds, cornerRadius: signUpView.layer.cornerRadius).cgPath
signUpView.layer.shouldRasterize = true
signUpView.layer.shadowColor = UIColor.black.cgColor
signUpView.layer.shadowOffset = .zero
signUpView.layer.shadowOpacity = 1
signUpView.layer.shadowRadius = 20
signUpView.layer.masksToBounds = false
}
Подробнее .. Objective-C / Swift (iOS) Когда применяются автоматические ограничения в рабочем процессе View / ViewController?
Вам не нужно обновлять xib, если ваши ограничения работают. Вместо использования границ попробуйте использовать frame? см. обновленный ответ.
Я сделал это, и теперь тень плавает вправо, а не влево. Хотя результат тот же. И вы имеете в виду мой файл .storyboard от .xib? В противном случае у меня не настроен файл .xib.
Да, .xib обычно представляет собой отдельный экран в файле .storyboard (вам не нужно беспокоиться об этом для вашей проблемы). Можете ли вы сделать снимок экрана с вашими ограничениями UIView и как они выглядят в вашей раскадровке?
Ну вот. Надеюсь, этого достаточно! По сути, у меня есть только один UIView в UIViewController с ограничениями 40pt со всех сторон. imgur.com/a/jrSmc8R
Я не уверен, в чем может быть проблема. Вы отменяете функцию и называете super? Если вы поместите точку останова в viewdidLoad и viewWillLayoutSubviews, сможете ли вы установить signUpView.frame в обеих функциях?
Позвольте нам продолжить обсуждение в чате.
Я пробовал это, но результат все тот же. Я создал функцию viewWillLayoutSubviews в связанном файле, есть идеи, что я делаю неправильно? И должен ли я каким-то образом обновлять файл .xib? Извините, я новичок в программировании на Swift.