Как установить границы только для верхнего, левого и правого углового радиуса с верхним левым и верхним правым в UIView? - PullRequest
1 голос
/ 21 января 2020

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

-(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;

}

Для справки я приложил снимок экрана для вышеуказанного вопроса.

enter image description here

Помощь в быстрой также приветствуется.

Ответы [ 2 ]

0 голосов
/ 21 января 2020

Вот демоверсия по быстрому iOS Площадка возможного сближения

enter image description here

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()
0 голосов
/ 21 января 2020

Я не думаю, что это возможно в раскадровке. Однако вы можете расширить 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)
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...