2014-09-25 2 views
14

나는 아이폰 6과 아이폰 6+에서 셀 레이아웃이 올바르게되도록 제약 조건을 가진 UITableViewCell을 가지고있다.UITableViewCell awakeFromNib 잘못된 프레임 크기

셀 내용의 크기가 올바르게 올바르게 조정됩니다. 그러나 내부 뷰 중 하나에 하위 그라데이션을 그려야합니다. 그렇게하기 위해 awakeFromNib을 사용하여 하위 레이어를 그립니다.

AwakeFromNib는 자동 크기 조정 전에 프레임 크기를 제공하므로 그라디언트 하위보기의 크기가 올바르지 않습니다.

layoutSubviews를 처음 사용할 때 크기가 잘못되어 셀이 올바른 크기가되기 전에 스크롤해야합니다. 그래서 그 방법도 작동하지 않습니다

올바르게 그리려면 올바른 프레임 크기를 얻기 위해 어떤 방법을 사용해야합니까?

답변

21

이 코드는 나를 위해 일했으며 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 
    } 
} 
13

awakeFromNib 중에는 프레임 레이아웃이 나타나지 않습니다. 사용자 정의 셀이

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

을 할 수 있습니다 또는 당신의 drawRect 방법 전에 호출이

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

} 

applyLayoutAttributes 같은 방법을 applyLayoutAttributes 오버라이드 (override) 할 수 있지만 여전히 RECT의 크기 parameteres 있습니다.

+1

applyLayoutAttributes는 collectionCells에서만 작동하는 것으로 보입니다. 내 UITableViewCell 들어 당신 drawRect 사용 : 답변 - 감사합니다! – amergin

+0

이것은 나를 위해 일했지만 drawRect를 무시하면 대개 성능이 저하됩니까? –

3

UITableViewCell에서 UI를 수정하려는 경우 @angshuk 대답이 완벽합니다. 제 경우처럼 스토리 보드/autolayout을 사용하여 UITableViewCell 내부에 배치 된 UIView에 런타임에 다른 레이어를 추가하려고했습니다. 같은 것을 내부에서 시도했습니다 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 
} 

희망이 도움이되었습니다. 감사.

+0

이것은 나를 위해 일했지만 drawRect를 무시하면 대개 성능이 저하됩니까? –

관련 문제