UITableViewCell awakeFromNib框架大小错误

时间:2014-09-25 22:48:36

标签: objective-c iphone uitableview resize autolayout

我有一个带约束的UITableViewCell,以便在iPhone 6和iPhone 6 +上正确排列单元格。

正确调整单元格内容的大小。但是,我需要在其中一个视图上绘制一个子图层渐变。为了做到这一点,我正在使用awakeFromNib来绘制子层。

AwakeFromNib在自动调整之前给出了帧的大小,因此渐变子视图的大小不正确。

如果我使用layoutSubviews,第一次调用时,大小也是错误的,单元格需要在大小合适之前滚动;所以该方法也不起作用

我应该使用什么方法来获得正确的帧尺寸才能正确绘制?

3 个答案:

答案 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
}

希望这有帮助。感谢。