在 UITableViewCell 中居中视图?看起来居中于 UI 层次结构,但不在实际应用程序中?
Center a view inside of an UITableViewCell? Looks centered in the UI hierarchy, but not in the actual app?
我正在尝试将自定义 UIView 置于 UITableViewCell 的中心。一些相当基本的 imo。我使用这段代码创建了 UIView,我在 Whosebug 上找到了它:
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 预览中居中了。
当运行应用程序看起来像这样,你可以看到左边有一个空隙,但右边没有,所以它没有居中:
但是当我查看 UI 层次结构时,它是居中的?!
删除 centered horizontally
约束并将 trailing constraint
添加到 15 将解决您的问题
在我这边已经足够好了
没关系,我发现了问题。 UIView 放置正确,但是我放置在顶部的 gradientLayer 尺寸错误。所以我添加了行
gradientLayer.frame = self.bounds
在框架 UIView 中的 layoutSubviews 函数中 class。
我正在尝试将自定义 UIView 置于 UITableViewCell 的中心。一些相当基本的 imo。我使用这段代码创建了 UIView,我在 Whosebug 上找到了它:
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 预览中居中了。
当运行应用程序看起来像这样,你可以看到左边有一个空隙,但右边没有,所以它没有居中:
但是当我查看 UI 层次结构时,它是居中的?!
centered horizontally
约束并将 trailing constraint
添加到 15 将解决您的问题
在我这边已经足够好了
没关系,我发现了问题。 UIView 放置正确,但是我放置在顶部的 gradientLayer 尺寸错误。所以我添加了行
gradientLayer.frame = self.bounds
在框架 UIView 中的 layoutSubviews 函数中 class。