IPhone6とiPhone6 +でセルが正しくレイアウトされるように、制約付きのUITableViewCellがあります。
セルの内容が正しくサイズ変更されます。ただし、内部のビューの1つにサブレイヤーグラデーションを描画する必要があります。そのために、awakeFromNibを使用してサブレイヤーを描画しています。
AwakeFromNibは、自動サイズ変更の前にフレームのサイズを指定しているため、グラデーションサブビューは適切なサイズではありません。
LayoutSubviewsを初めて使用する場合、サイズも間違っているため、適切なサイズになる前にセルをスクロールする必要があります。そのため、このメソッドも機能しません
正しく描画するために適切なフレームサイズを取得するには、どの方法を使用する必要がありますか?
このコードは私のために働いた、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
}
}
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のサイズパラメーターがあります。
@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
}
これがお役に立てば幸いです。ありがとう。