UITableViewCell 子类中的掩码在第一次加载时未正确呈现
Mask in UITableViewCell subclass not properly rendering on first load
我正在尝试创建一个包含两个圆角视图的 UITableViewCell 子类,一个在顶部,一个在底部,它们一起最终成为单元格内的圆角矩形视图,所有 4 个边都有缩进 space (由原型单元的故事板中的自动布局约束设置)。这些单元格是加载到 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. 初始加载的最终渲染右侧圆角渲染不正常?
此单元格作为原型存在于故事板中,其插图是通过自动布局约束创建的。 (一个常量设置顶部和底部视图与顶部、底部、右侧和左侧的适当距离)。很明显,这些约束在重新加载单元格时有效,但由于某种原因我逃避了初始加载。
显然答案很简单。 mask 方法在单元格的 layoutSubviews 中被调用,视图本身还没有设置它们的边界。所以我将视图子 class 编辑到一个新的 RoundedView class 中,并为角添加了一个 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
}
}
然后我将视图更改为那个 subclass 然后这样调用它:
self.topView.corners = UIRectCorner.TopLeft.union(UIRectCorner.TopRight)
self.bottomView.corners = UIRectCorner.BottomLeft.union(UIRectCorner.BottomRight)
我正在尝试创建一个包含两个圆角视图的 UITableViewCell 子类,一个在顶部,一个在底部,它们一起最终成为单元格内的圆角矩形视图,所有 4 个边都有缩进 space (由原型单元的故事板中的自动布局约束设置)。这些单元格是加载到 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. 初始加载的最终渲染右侧圆角渲染不正常?
此单元格作为原型存在于故事板中,其插图是通过自动布局约束创建的。 (一个常量设置顶部和底部视图与顶部、底部、右侧和左侧的适当距离)。很明显,这些约束在重新加载单元格时有效,但由于某种原因我逃避了初始加载。
显然答案很简单。 mask 方法在单元格的 layoutSubviews 中被调用,视图本身还没有设置它们的边界。所以我将视图子 class 编辑到一个新的 RoundedView class 中,并为角添加了一个 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
}
}
然后我将视图更改为那个 subclass 然后这样调用它:
self.topView.corners = UIRectCorner.TopLeft.union(UIRectCorner.TopRight)
self.bottomView.corners = UIRectCorner.BottomLeft.union(UIRectCorner.BottomRight)