2014-09-25 20 views
14

Tôi có một UITableViewCell với các ràng buộc để các ô bố trí chính xác trên iPhone 6 và iPhone 6+.UITableViewCell awakeFromNib kích thước khung sai

Nội dung ô chính xác định lại kích thước chính xác. Tuy nhiên, tôi cần vẽ một gradient lớp con trên một trong các khung nhìn bên trong. Để làm như vậy, tôi đang sử dụng awakeFromNib để vẽ lớp con.

AwakeFromNib cho kích thước của khung trước khi nó tự động hóa và do đó chế độ xem phụ đề dốc không đúng kích thước.

Nếu tôi sử dụng layoutSubviews, lần đầu tiên được gọi, kích thước cũng sai và ô cần được cuộn trước khi có kích thước phù hợp; do đó phương pháp đó cũng không hoạt động

Tôi nên sử dụng phương pháp nào để có được kích thước khung hình phù hợp để vẽ chính xác?

Trả lời

21

Mã này làm việc cho tôi, được viết bằng 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

trong khi tỉnh táoTừ bố cục khung không xuất hiện. Ngày Cell tùy chỉnh của bạn bạn có thể làm điều này

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

Hoặc bạn có thể ghi đè lên applyLayoutAttributes phương pháp như thế này

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

} 

applyLayoutAttributes được gọi trước khi phương pháp drawRect nhưng vẫn có parameteres kích thước của rect.

+1

applyLayoutAttributes dường như chỉ hoạt động đối với collectionCells. Đối với UITableViewCell tôi đã sử dụng drawRect của bạn: câu trả lời - cảm ơn! – amergin

+0

Điều này làm việc cho tôi, nhưng ghi đè drawRect thường làm giảm hiệu suất phải không? –

3

@angshuk câu trả lời là hoàn hảo nếu có ai đó muốn sửa đổi giao diện người dùng bên trong UITableViewCell. Giống như trong trường hợp của tôi, tôi đã cố gắng để thêm một lớp khác nhau trên thời gian chạy đến một UIView, được đặt bên trong UITableViewCell bằng cách sử dụng storyboard/autolayout. Đã thử điều tương tự bên trong awakeFromNib() & layoutSubviews() cũng vậy. Không có gì hiệu quả.

Đây là cùng mã sử dụng Swift. Nhân tiện tôi đang sử dụng Xcode 7.3.1 với 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 
} 

Hy vọng điều này sẽ hữu ích. Cảm ơn.

+0

Điều này làm việc cho tôi, nhưng ghi đè drawRect thường làm giảm hiệu suất phải không? –

Các vấn đề liên quan