Тень UIView на Ipad не соответствует ширине вида - PullRequest
0 голосов
/ 18 октября 2018

Я создал простое расширение для UIView, чтобы добавить тень «капли» в UIViews, оно отлично работает на iPhone, но не работает корректно на iPad.Я не могу понять, чего мне не хватает, любые идеи о том, как улучшить / исправить это, чтобы тень правильно отображалась на iPad и iPhone, были бы потрясающими

extension UIView {
func addShadow() {
    self.layer.shadowPath = UIBezierPath(rect: self.bounds).cgPath
    self.layer.shadowColor = UIColor.black.cgColor
    self.layer.shadowOpacity = 0.5
    self.layer.shadowOffset = .zero
    self.layer.shadowRadius = 10
}

}

Вот как это выглядит на iPad:

UIView with shadow on iPad

Я звоню из UIView примерно так:

class AggregateDataViewImplementation: UIView, AggregateDataView {
    override func awakeFromNib() {
        layoutView()
    }

    private func layoutView() {
        self.addShadow()
    }

...

}

Ответы [ 2 ]

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

Чтение комментариев заставило меня задуматься, и я смог заставить это работать идеально, немного передвигая вещи!Спасибо всем, что нашли время для комментариев!

Я сохранил добавочный номер из UIView, но переместил вызов из вызова awakeFromNib() в вызов viewDidLoad() родительского VC представлений.Чтобы справиться с ротацией устройств, я добавил вызов viewWillTransition(...), полный фрагмент которого приведен ниже.

 // MARK: - Lifecycle

override func viewDidLoad() {
    super.viewDidLoad()
    guard let primaryView = primaryView as? AggregateDataViewImplementation else { return }
    primaryView.didTapClose = { [weak self] in
        self?.didTapClose?()
    }
    primaryView.tableView.delegate = self
    primaryView.tableView.dataSource = self
    primaryView.tableView.tableFooterView = UIView()

    let nib = UINib(nibName: "AggregateDataTableViewCell", bundle: nil)
    primaryView.tableView.register(nib, forCellReuseIdentifier: "AggregateDataTableViewCell")
    primaryView.addShadow()
}

override func viewDidAppear(_ animated: Bool) {
    super.viewDidAppear(animated)
    guard let primaryView = primaryView as? AggregateDataViewImplementation else { return }
    primaryView.tableView.reloadData()
}

override func viewWillTransition(to size: CGSize, with coordinator: UIViewControllerTransitionCoordinator) {
    super.viewWillTransition(to: size, with: coordinator)

    coordinator.animate(alongsideTransition: { (_) in
        guard let primaryView = self.primaryView as? AggregateDataViewImplementation else { return }
        primaryView.addShadow()
    }, completion: nil)

}

еще раз спасибо!

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

Возможно, ваша проблема здесь:

self.layer.shadowPath = UIBezierPath(rect: self.bounds).cgPath

Прямоугольник тени соответствует здесь, если self.bounds не соответствует фактическому прямоугольнику , может появиться сообщение об ошибке.Предложите, что пишите так:

 self.bgView.layer.shadowPath = UIBezierPath(rect: self.bgView.bounds).cgPath
 self.bgView.layer.shadowColor = UIColor.black.cgColor
 self.bgView.layer.shadowOpacity = 0.5
 self.bgView.layer.shadowOffset = .zero
 self.bgView.layer.shadowRadius = 10

надеюсь помочь вам.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...