Центрировать вид внутри UITableViewCell? Выглядит в центре иерархии пользовательского интерфейса, но не в реальном приложении - PullRequest
0 голосов
/ 14 января 2020

Я пытаюсь центрировать пользовательский UIView в UITableViewCell. Что-то довольно базовое c IMO. Я использовал этот код для создания UIView, я нашел его здесь в stackoverflow:

class SkeletonView: UIView {

    var startLocations : [NSNumber] = [-1.0,-0.5, 0.0]
    var endLocations : [NSNumber] = [1.0,1.5, 2.0]

    var gradientBackgroundColor : CGColor = UIColor(white: 0.85, alpha: 1.0).cgColor
    var gradientMovingColor : CGColor = UIColor(white: 0.75, alpha: 1.0).cgColor

    var movingAnimationDuration : CFTimeInterval = 0.8
    var delayBetweenAnimationLoops : CFTimeInterval = 1.0


    lazy var gradientLayer : CAGradientLayer = {

        let gradientLayer = CAGradientLayer()
        gradientLayer.frame = self.bounds
        gradientLayer.startPoint = CGPoint(x: 0.0, y: 1.0)
        gradientLayer.endPoint = CGPoint(x: 1.0, y: 1.0)
        gradientLayer.colors = [
            gradientBackgroundColor,
            gradientMovingColor,
            gradientBackgroundColor
        ]
        gradientLayer.locations = self.startLocations
        self.layer.addSublayer(gradientLayer)
        return gradientLayer
    }()


    func startAnimating(){
        let animation = CABasicAnimation(keyPath: "locations")
        animation.fromValue = self.startLocations
        animation.toValue = self.endLocations
        animation.duration = self.movingAnimationDuration
        animation.timingFunction = CAMediaTimingFunction(name: CAMediaTimingFunctionName.easeInEaseOut)


        let animationGroup = CAAnimationGroup()
        animationGroup.duration = self.movingAnimationDuration + self.delayBetweenAnimationLoops
        animationGroup.animations = [animation]
        animationGroup.repeatCount = .infinity
        self.gradientLayer.add(animationGroup, forKey: animation.keyPath)
    }

    func stopAnimating() {
        self.gradientLayer.removeAllAnimations()
    }
}

Затем я просто добавил вид к моей ячейке xib, центрированный по горизонтали, передний край +15, верхний +15 и нижний + 15 (с приоритетом 900, чтобы автоматическое расположение не волновало, что высота равна 320 вместо расчетного значения 320,1). Таким образом, он центрируется в предварительном просмотре XIB.

enter image description here

При запуске приложения это выглядит так, как вы можете видеть, что есть разрыв с левой стороны, но не с правой стороны, поэтому он не центрирован:

uita

Но когда я взгляну на иерархию пользовательского интерфейса, он будет центрирован ?! enter image description here

Ответы [ 2 ]

0 голосов
/ 14 января 2020

Неважно, я нашел проблему. UIView был размещен правильно, однако градиентный слой, который я поместил поверх, получал неправильный размер. Поэтому я добавил строку

gradientLayer.frame = self.bounds

в функцию layoutSubviews внутри скелетного класса UIView.

0 голосов
/ 14 января 2020

enter image description here Удалите centered horizontally ограничение и добавьте trailing constraint к 15, чтобы решить вашу проблему

достаточно хорошо на моей стороне

...