UITableViewCell awakeFromNib框架大小错误

use*_*464 19 iphone resize objective-c uitableview autolayout

我有一个带约束的UITableViewCell,以便在iPhone 6和iPhone 6+上正确布局单元格.

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

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

如果我使用layoutSubviews,第一次调用时,大小也是错误的,并且单元格需要在其大小合适之前滚动; 所以这个方法也行不通

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

小智 26

这段代码对我有用,用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
    }
}
Run Code Online (Sandbox Code Playgroud)


ang*_*nag 17

在awakeFromNib期间,框架布局不会出现.在您的自定义单元格上,您可以执行此操作

-(void)drawRect:(CGRect)rect
{
    [super drawRect:rect];
    // Enter Custom Code
}
Run Code Online (Sandbox Code Playgroud)

或者您可以像这样覆盖applyLayoutAttributes方法

-(void)applyLayoutAttributes:(UICollectionViewLayoutAttributes *)layoutAttributes
{
    [super applyLayoutAttributes:layoutAttributes];
    // Enter custom Code here

}
Run Code Online (Sandbox Code Playgroud)

applyLayoutAttributes在drawRect方法之前调用,但仍具有rect的大小参数.


onC*_*ion 6

如果有人要修改UITableViewCell中的UI,@ angshuk答案是完美的。就像我的情况一样,我试图在运行时向UIView添加不同的图层,并使用情节提要/自动布局将其放置在UITableViewCell中。在awakeFromNib()&内layoutSubviews()也尝试过同样的事情。没事。

这是使用Swift的相同代码。顺便说一句,我在Swift 2.2中使用Xcode 7.3.1。

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
}
Run Code Online (Sandbox Code Playgroud)

希望这会有所帮助。谢谢。