2
votes

I need to round corner only the top left and bottom left of a view, so i tried this:

func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell
{
    let cell = tableView.dequeueReusableCell(withIdentifier: "teamCell", for: indexPath) as! TeamCell

    let view = cell.backgroundCellView
    let rectShape = CAShapeLayer()
    rectShape.bounds = (view?.frame)!
    rectShape.position = (view?.center)!
    rectShape.path = UIBezierPath(roundedRect: (view?.bounds)!, byRoundingCorners: [.topRight, .topLeft], cornerRadii: CGSize(width: 20, height: 20)).cgPath
    view?.layer.mask = rectShape
    view?.layer.masksToBounds = true

    return cell
}

and it worked very well, but after I put the constraints (trailing, leading, top and botton - i need a responsive view) only the topLeft corner is rounded and not the other. How could i fix it?

4
Where is the above code located?beyowulf
in cellForRow, after calling dequeueReusableCell method (I'm going to edit my question)Fabio Cenni
You should try moving it to your UITableViewCell subclass's layoutSubviews method, after calling super.layoutSubviews()beyowulf
Putting the code that builds the mask into the cell's laoutSubviews is the correct answer. @beyowulf, you should post that as an answer so the OP can accept it.Duncan C

4 Answers

6
votes

Starting with iOS 11, and Swift 4, you can use maskedCorners:

let myView = UIView()

myView.layer.cornerRadius = 15
myView.clipsToBounds = true

// Top Left Corner: .layerMinXMinYCorner
// Top Right Corner: .layerMaxXMinYCorner
// Bottom Left Corner: .layerMinXMaxYCorner
// Bottom Right Corner: .layerMaxXMaxYCorner
myView.layer.maskedCorners = [.layerMinXMinYCorner, .layerMinXMaxYCorner]
2
votes

try this one

 let path = UIBezierPath(roundedRect:viewToRound.bounds, byRoundingCorners:[.TopLeftt, .BottomLeft], cornerRadii: CGSizeMake(20, 20))
    let maskLayer = CAShapeLayer()
    maskLayer.path = path.CGPath
    view.layer.mask = maskLayer
2
votes

A simple way to do this is to set the corner radius of your cell's content view, and then to prevent the right side corners of the contents from being rounded you could constrain them to have x trailing space to the content view (where x is your corner radius). This does require you to adjust your layout to account for the extra padding on the right side of your cells though.

-1
votes

Try using

view?.layer.cornerRadius = 15 

insted of

rectShape.path = UIBezierPath(roundedRect: (view?.bounds)!, byRoundingCorners: [.topRight, .topLeft], cornerRadii: CGSize(width: 20, height: 20)).cgPath