UITableViewCell子类中的掩码在首次加载时未正确呈现

时间:2015-11-06 00:32:31

标签: ios uitableview autolayout swift2 xcode7

我正在尝试创建一个包含两个圆形视图的UITableViewCell子类,一个在顶部,一个在底部,它们一起最终成为单元格内的圆角矩形视图,在所有4个边上都有缩进空间(由自动布局约束设置)在原型单元的故事板中)。这些单元格是加载到UIContainerView中的tableview的一部分,UIContainerView根据选择控件的选择将其内容换掉。

这就是我希望细胞看起来像(变黑):

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

当我切换到另一个标签,然后返回时,它会正确渲染单元格。

我在父视图控制器中使用此方法(改编自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方法如下所示:

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如下所示:

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.初始载荷的最终渲染,右侧的圆角未正确渲染?

此单元格作为原型存在于故事板中,并通过自动布局约束创建插图。 (根据需要恒定设置顶部和底部视图与顶部,底部,右侧和左侧的距离)。很明显,这些约束在重新加载单元格时起作用,但由于某些原因导致我无法在初始加载时起作用。

1 个答案:

答案 0 :(得分:0)

显然答案很简单。掩码方法在layoutSubviews中为单元格调用,视图本身尚未设置其边界。所以我将视图子类化为一个新的RoundedView类,并为角点和修改后的掩码方法添加了一个var:

.Cast()

然后我将视图更改为该子类,然后像这样调用它:

myArrayVariable.Cast<SomeClass>().ToList() //ok, NOW ToList works fine