【问题标题】:how to set boarder for only top, left and right with corner radius with top-left and top-right in UIView?如何在UIView中为左上角和右上角的角半径仅设置顶部,左侧和右侧的边框?
【发布时间】:2020-05-07 04:27:42
【问题描述】:

我使用以下方法在视图的左侧、右侧和顶部添加边框,然后我将角半径设置为查看,我不会给出适当的结果。

-(void)addLeftBorder:(UIView *)viewName
{
    CALayer *leftBorder = [CALayer layer];
    leftBorder.backgroundColor = [UIColor redColor].CGColor;
    leftBorder.frame = CGRectMake(0,0,1.0,viewName.frame.size.height);
    viewName.clipsToBounds = true;
    leftBorder.cornerRadius = 25.0;
    [viewName.layer addSublayer:leftBorder];
}
-(void)addRightBorder:(UIView *)viewName
{
    CALayer *rightBorder = [CALayer layer];
    rightBorder.backgroundColor = [UIColor redColor].CGColor;
    rightBorder.frame = CGRectMake(viewName.frame.size.width - 1.0,0,1.0,viewName.frame.size.height);
    viewName.clipsToBounds = true;
    rightBorder.cornerRadius = 25.0;
    [viewName.layer addSublayer:rightBorder];
}
-(void)addtopBorder:(UIView *)viewName
{
    CALayer *topBorder = [CALayer layer];
    topBorder.backgroundColor = [UIColor redColor].CGColor;
    topBorder.frame = CGRectMake(0,0,viewName.frame.size.width,1.0);
    viewName.clipsToBounds = true;
    topBorder.cornerRadius = 25.0;
    [viewName.layer addSublayer:topBorder];
}

这里我们设置要查看的角半径。

-(void)setupUI{
    [self addLeftBorder:self.replyContainerView];
    [self addRightBorder:self.replyContainerView];
    [self addtopBorder:self.replyContainerView];
    self.replyContainerView.layer.cornerRadius = self.comment.bounds.size.height/2;
    self.replyContainerView.clipsToBounds = true;
    self.replyContainerView.layer.maskedCorners = kCALayerMaxXMinYCorner | kCALayerMinXMinYCorner;

}

为了参考,我附上了上述问题的屏幕截图。

在 swift 中的帮助也很感激。

【问题讨论】:

  • 有趣的问题

标签: ios objective-c border cornerradius


【解决方案1】:

我认为这在故事板中是不可能的。但是,您可以扩展 UIView 以在初始化时自动绘制左上角和右上角的边框和边框颜色。然后将其分配到您的故事板中。

@IBDesignable class BottomSheetView: UIView {
    override func layoutSubviews() {
        super.layoutSubviews()
        drawBorder()
    }

    override func prepareForInterfaceBuilder() {
        super.prepareForInterfaceBuilder()
        drawBorder()
    }

    private func drawBorder() {
        let path = UIBezierPath(
            roundedRect: bounds,
            byRoundingCorners: [.topRight, .topLeft],
            cornerRadii: CGSize(width: 16, height: 16))
        let maskLayer = CAShapeLayer()
        maskLayer.path = path.cgPath
        layer.mask = maskLayer
    }
}

要在一侧绘制边框,您可以查看here。您可以选择哪些边,边的哪个部分以及边框的大小。

let topBorder: CALayer = CALayer()
topBorder.frame = CGRect(x: 0, y: 0, width: myView.frame.size.width, height: 1)
topBorder.backgroundColor = UIColor.purple.cgColor
myView.layer.addSublayer(topBorder)

【讨论】:

    【解决方案2】:

    这是 swift iOS Playground 中可能的方法的演示

    import UIKit
    import PlaygroundSupport
    
    class MyViewController : UIViewController {
        override func loadView() {
            let view = UIView()
            view.backgroundColor = .yellow
    
            // example view to have top-side rounded borders
            let label = UILabel()
            label.frame = CGRect(x: 100, y: 200, width: 200, height: 200)
            label.textColor = .black
            label.backgroundColor = .white
    
            // radius constant
            let radius: CGFloat = 25
    
            // initial part of path to have rounded top cornders
            let path = UIBezierPath()
            path.move(to: CGPoint(x: 0, y: radius * 2)) // << border height just for demo
            path.addLine(to: CGPoint(x: 0, y: radius))
            path.addArc(withCenter: CGPoint(x: radius, y: radius), radius: radius, startAngle: -.pi, endAngle: -.pi/2, clockwise: true)
            path.addLine(to: CGPoint(x: label.bounds.maxX - radius, y: 0))
            path.addArc(withCenter: CGPoint(x: label.bounds.maxX - radius, y: radius), radius: radius, startAngle: -.pi/2.0, endAngle: 0, clockwise: true)
            path.addLine(to: CGPoint(x: label.bounds.maxX, y: radius * 2))  // << border height just for demo
    
            // shape layer to drop rounded corners
            var shape = CAShapeLayer()
            shape.path = path.cgPath
            shape.strokeColor = UIColor.red.cgColor
            shape.lineWidth = 2.0
            shape.fillColor = UIColor.clear.cgColor
            label.layer.addSublayer(shape)
    
            // ... extending path to complete view bounds to mask
            path.addLine(to: CGPoint(x: label.bounds.maxX, y: label.bounds.maxY))
            path.addLine(to: CGPoint(x: 0, y: label.bounds.maxY))
            path.close()
            // ... shape to mask target view
            shape = CAShapeLayer()
            shape.path = path.cgPath
            shape.fillColor = UIColor.black.cgColor
            label.layer.mask = shape
    
            view.addSubview(label)
            self.view = view
        }
    }
    // Present the view controller in the Live View window
    PlaygroundPage.current.liveView = MyViewController()
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2014-10-26
      • 2012-04-27
      • 2012-02-17
      • 1970-01-01
      • 2015-09-22
      • 2016-06-08
      • 2021-08-21
      相关资源
      最近更新 更多