web-dev-qa-db-ja.com

UITableViewCellawakeFromNibのフレームサイズが間違っています

IPhone6とiPhone6 +でセルが正しくレイアウトされるように、制約付きのUITableViewCellがあります。

セルの内容が正しくサイズ変更されます。ただし、内部のビューの1つにサブレイヤーグラデーションを描画する必要があります。そのために、awakeFromNibを使用してサブレイヤーを描画しています。

AwakeFromNibは、自動サイズ変更の前にフレームのサイズを指定しているため、グラデーションサブビューは適切なサイズではありません。

LayoutSubviewsを初めて使用する場合、サイズも間違っているため、適切なサイズになる前にセルをスクロールする必要があります。そのため、このメソッドも機能しません

正しく描画するために適切なフレームサイズを取得するには、どの方法を使用する必要がありますか?

19
user1218464

このコードは私のために働いた、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
    }
}
25
Noel

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のサイズパラメーターがあります。

16
angshuk nag

@angshukの回答は、UITableViewCell内のUIを変更したい場合に最適です。私の場合と同様に、ストーリーボード/自動レイアウトを使用してUITableViewCell内に配置された、実行時に別のレイヤーをUIViewに追加しようとしました。 awakeFromNib()layoutSubviews()内でも同じことを試しました。何も機能しませんでした。

これはSwiftを使用した同じコードです。ちなみに私はXcode7.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
}

これがお役に立てば幸いです。ありがとう。

4
onCompletion