2015-11-06 40 views
1

我正在嘗試創建一個UITableViewCell子類,它包含兩個圓角視圖,一個在頂部,一個在底部,一起以單元格內的圓角矩形視圖結尾,並帶有縮進空間在所有4邊(由原型單元格的故事板中的自動佈局約束設置)。這些單元格是加載到UIContainerView中的tableview的一部分,該UIContainerView根據選擇控件的選擇將其內容換出。UITableViewCell子類中的蒙版在第一次加載時不能正確呈現

這是我想要的細胞看起來像(塗黑):

Properly Rendered

這裏是什麼樣子簡單地說,當第一次加載:

Briefly looks like this (insets appear not to render at first)

這裏是它首次加載後的樣子:

Insets now working, but the mask on the top and bottom right appear not to render

當我切換到不同的選項卡,然後回來,它正確呈現單元格。

override func viewDidLoad() { 

... // grab data in a background network call, populating the array of model objects 
    self.currentSelectedViewController!.view.translatesAutoresizingMaskIntoConstraints = false 
    self.addChildViewController(self.currentSelectedViewController!) 
    self.addSubView(self.currentSelectedViewController!.view, toView: self.containerView) 
    self.refreshContainerView() 
    super.viewDidLoad() 
} 

refreshContainerView看起來像這樣::

我在父視圖控制器(改編自this

func cycleFromViewController(oldViewController: UIViewController, toViewController newViewController: UIViewController) { 
    oldViewController.willMoveToParentViewController(nil) 
    self.addChildViewController(newViewController) 
    self.addSubView(newViewController.view, toView:self.containerView!) 
    newViewController.view.alpha = 0 
    newViewController.view.layoutIfNeeded() 
    UIView.animateWithDuration(0.25, animations: { 
     newViewController.view.alpha = 1 
     oldViewController.view.alpha = 0 
     }, 
     completion: { finished in 
      oldViewController.view.removeFromSuperview() 
      oldViewController.removeFromParentViewController() 
      newViewController.didMoveToParentViewController(self) 
    }) 
} 

父視圖控制器的viewDidLoad方法被稱爲像這樣使用此方法

func refreshContainerView() { 

    let currentVC = self.currentSelectedViewController as! MyTableViewController 
     currentVC.modelObjectList = self.modelObjectList 
     self.label.hidden = true 
     self.button.hidden = true 
     currentVC.tableView.reloadData() 
} 

這是我的單元格的佈局子視圖方法:

override func layoutSubviews() { 

    super.layoutSubviews() 

    self.reminderView.backgroundColor = UIColor.grayColor() 

    if let aModel = self.model { 
     self.configureWithModel(aModel) 
    } 

    self.setMaskToView(self.topView, corners: UIRectCorner.TopLeft.union(UIRectCorner.TopRight)) 
    self.setMaskToView(self.bottomView, corners: UIRectCorner.BottomLeft.union(UIRectCorner.BottomRight)) 
} 

有什麼想法就如何解決 1.初始加載簡要沒有插圖和 2.初始加載與右側無法正常渲染圓角最終渲染?

此單元格作爲原型存在於故事板中,並通過自動佈局約束創建了插圖。 (根據情況不變地設置頂部和底部視圖與頂部,底部,右側和左側的距離)。很明顯,這些約束在單元重新加載時起作用,但由於某種原因逃避我而不是在初始加載時。

回答

0

顯然答案很簡單。掩碼方法在cell的layoutSubviews中被調用,視圖本身還沒有設置邊界。所以我子類的觀點到一個新的RoundedView類,並增加了對角的VAR和修改面膜方法:

class RoundedView: UIView { 

    var corners : UIRectCorner = [] 

    override func layoutSubviews() { 
     self.setMaskForCorners(corners) 
    } 

    func setMaskForCorners(corners: UIRectCorner) { 
     let rounded = UIBezierPath(roundedRect: self.bounds, byRoundingCorners: corners, cornerRadii: CGSize(width: 10, height: 10)) 
     let mask = CAShapeLayer() 

     mask.path = rounded.CGPath 
     self.layer.mask = mask 
    } 
} 

然後,我改變了看法是子類,然後調用它像這樣:

self.topView.corners = UIRectCorner.TopLeft.union(UIRectCorner.TopRight) 
    self.bottomView.corners = UIRectCorner.BottomLeft.union(UIRectCorner.BottomRight) 
相關問題