как установить границу только сверху, слева и справа с угловым радиусом с верхним левым и верхним правым в UIView?

Я использую нижеприведенные методы, чтобы добавить границу слева, справа и сверху вида, после чего я устанавливаю угловой радиус для просмотра, и я не дам соответствующего результата.

-(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 также приветствуется.


person Daxesh Nagar    schedule 21.01.2020    source источник
comment
интересный вопрос   -  person Warm_up    schedule 21.01.2020


Ответы (2)


Я не думаю, что это возможно в раскадровке. Однако вы можете расширить 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
    }
}

Для рисования границ с одной стороны вы можете посмотреть здесь. Вы можете выбрать, какие стороны, какой участок стороны и размер границы.

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)
person Philip    schedule 21.01.2020

Вот демонстрация возможного подхода в 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()
person Asperi    schedule 21.01.2020