【问题标题】:UITableViewCell awakeFromNib wrong frame sizeUITableViewCell awakeFromNib 错误的帧大小
【发布时间】:2014-11-20 20:44:06
【问题描述】:

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

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

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

如果我使用layoutSubviews,第一次调用,大小也是错误的,需要滚动单元格才能有正确的大小;所以这个方法也行不通

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

【问题讨论】:

    标签: objective-c iphone uitableview resize autolayout


    【解决方案1】:

    @angshuk 答案是完美的,如果有人想在UITableViewCell 中修改 UI。就像在我的情况下,我试图在运行时将不同的层添加到 UIView,使用故事板/自动布局放置在 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
    }
    

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

    【讨论】:

    • 这对我有用,但覆盖 drawRect 通常会降低性能对吗?
    • 它对我有用,最后我找到了一个答案,我的单元格得到了正确的框架。谢谢!
    【解决方案2】:

    在 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 的大小参数。

    【讨论】:

    • applyLayoutAttributes 似乎只适用于 collectionCells。对于我的 UITableViewCell,我使用了你的 drawRect:答案 - 谢谢!
    • 这对我有用,但覆盖 drawRect 通常会降低性能对吗?
    【解决方案3】:

    这段代码对我有用,是用 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
        }
    }
    

    【讨论】:

    • layoutSubview() 被调用了很多次,在其中添加代码不是一个好习惯。它会降低性能。更好的覆盖drawRect方法的解决方案
    猜你喜欢
    • 1970-01-01
    • 2022-12-04
    • 2018-10-23
    • 1970-01-01
    • 2012-12-13
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多