我有一个带约束的UITableViewCell,以便在iPhone 6和iPhone 6 +上正确排列单元格。
正确调整单元格内容的大小。但是,我需要在其中一个视图上绘制一个子图层渐变。为了做到这一点,我正在使用awakeFromNib来绘制子层。
AwakeFromNib在自动调整之前给出了帧的大小,因此渐变子视图的大小不正确。
如果我使用layoutSubviews,第一次调用时,大小也是错误的,单元格需要在大小合适之前滚动;所以该方法也不起作用
我应该使用什么方法来获得正确的帧尺寸才能正确绘制?
答案 0 :(得分:23)
这段代码对我有用,用 Swift 编写。
import UIKit
import QuartzCore
class DemoTableViewCell: UITableViewCell {
@IBOutlet weak var gradientView: UIView!
private let gl = CAGradientLayer()
override func awakeFromNib() {
super.awakeFromNib()
// set gradient
let colors: [AnyObject] = [
UIColor.clearColor().CGColor,
UIColor(white: 0, alpha: 0.8).CGColor
]
gl.colors = colors
gradientView.layer.insertSublayer(gl, atIndex: 0)
}
override func layoutSubviews() {
super.layoutSubviews()
// update gradient
gl.frame = gradientView.bounds
}
}
答案 1 :(得分:15)
在awakeFromNib期间,不会出现帧布局。在您的自定义单元格上,您可以执行此操作
-(void)drawRect:(CGRect)rect
{
[super drawRect:rect];
// Enter Custom Code
}
或者您可以像这样覆盖applyLayoutAttributes方法
-(void)applyLayoutAttributes:(UICollectionViewLayoutAttributes *)layoutAttributes
{
[super applyLayoutAttributes:layoutAttributes];
// Enter custom Code here
}
applyLayoutAttributes在drawRect方法之前调用,但仍然具有rect的大小参数。
答案 2 :(得分:4)
@angshuk答案是完美的,如果有人想修改UITableViewCell内的UI。就像我的情况一样,我试图在运行时向UIView添加一个不同的层,使用storyboard / autolayout放置在UITableViewCell中。在awakeFromNib()
&内部尝试了同样的事情。 layoutSubviews()
也是。没有任何效果。
这是使用Swift的相同代码。顺便说一下,我使用Xcode 7.3.1和Swift 2.2。
import UIKit
class InviteMainCellClass: UITableViewCell {
@IBOutlet weak var shareCodeLblSuperView: UIView! //Custom view added using IB/Autolayout
override func awakeFromNib() {
super.awakeFromNib()
//shareCodeLblSuperView.addDashedBorderToView(self.shareCodeLblSuperView, viewBorderColor: UIColor.whiteColor(), borderWidth: 1.0) //Not worked
}
override func drawRect(rect: CGRect) {
super.drawRect(rect)
shareCodeLblSuperView.addDashedBorderToView(self.shareCodeLblSuperView, viewBorderColor: UIColor.whiteColor(), borderWidth: 1.0) //Worked
}
override func layoutSubviews() {
super.layoutSubviews()
//shareCodeLblSuperView.addDashedBorderToView(self.shareCodeLblSuperView, viewBorderColor: UIColor.whiteColor(), borderWidth: 1.0)//Not worked
}
希望这有帮助。感谢。