【问题标题】:Mask in UITableViewCell subclass not properly rendering on first loadUITableViewCell 子类中的掩码在首次加载时未正确呈现
【发布时间】:2015-11-06 00:32:31
【问题描述】:

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

这是我想要的单元格的样子(涂黑):

这是第一次加载时的简要外观:

这是第一次加载后的样子:

当我切换到不同的选项卡然后返回时,它会正确呈现单元格。

我在父视图控制器中使用这个方法(改编自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. 右侧圆角初始加载的最终渲染没有正确渲染?

此单元格作为原型存在于情节提要中,其插图是通过自动布局约束创建的。 (一个常数设置顶部和底部视图到顶部、底部、右侧和左侧的适当距离)。显然,这些约束在重新加载单元格时有效,但在初始加载时由于某种原因无法解决。

【问题讨论】:

    标签: ios uitableview autolayout swift2 xcode7


    【解决方案1】:

    显然,答案相当简单。在单元格的 layoutSubviews 中调用了 mask 方法,视图本身还没有设置它们的边界。所以我将视图子类化为一个新的 RoundedView 类,并为角添加了一个 var 和一个修改后的 mask 方法:

    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)
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2021-10-29
      • 2020-07-14
      • 2018-03-01
      • 1970-01-01
      • 2014-02-24
      • 1970-01-01
      • 2021-05-13
      相关资源
      最近更新 更多