Закругленные углы с разным радиусом

Мне нужно закруглить верхние углы вида с любым значением, а также нижние углы того же вида с другим значением. Здесь у меня есть код, который, как я думал, решит эту проблему. Но не работает ... Есть идеи?

        bottomPath = UIBezierPath(roundedRect:self.bounds,
                               byRoundingCorners:[.bottomLeft, .bottomRight],
                               cornerRadii: CGSize(width: radius, height:  radius))
        topPath = UIBezierPath(roundedRect:self.bounds,
                               byRoundingCorners:[.topLeft, .topRight],
                               cornerRadii: CGSize(width: radius, height:  radius))

        bottomPath.append(topPath)
        maskLayer = CAShapeLayer()
        maskLayer?.path = bottomPath.cgPath
        self.layer.mask = maskLayer

Если я прокомментирую bottomPath или topPath, я получаю скругленные верхние или нижние углы, но не оба. Спасибо

У этого ответа есть хорошее расширение UIBezierPath, которое позволит вам установить разные радиусы для каждого угла ... stackoverflow.com/a/43651478/6257435

DonMag 11.06.2018 14:55

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

Duncan C 11.06.2018 15:09
Стоит ли изучать PHP в 2026-2027 годах?
Стоит ли изучать PHP в 2026-2027 годах?
Привет всем, сегодня я хочу высказать свои соображения по поводу вопроса, который я уже много раз получал в своем сообществе: "Стоит ли изучать PHP в...
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
В JavaScript одним из самых запутанных понятий является поведение ключевого слова "this" в стрелочной и обычной функциях.
Приемы CSS-макетирования - floats и Flexbox
Приемы CSS-макетирования - floats и Flexbox
Здравствуйте, друзья-студенты! Готовы совершенствовать свои навыки веб-дизайна? Сегодня в нашем путешествии мы рассмотрим приемы CSS-верстки - в...
Тестирование функциональных ngrx-эффектов в Angular 16 с помощью Jest
В системе управления состояниями ngrx, совместимой с Angular 16, появились функциональные эффекты. Это здорово и делает код определенно легче для...
Концепция локализации и ее применение в приложениях React ⚡️
Концепция локализации и ее применение в приложениях React ⚡️
Локализация - это процесс адаптации приложения к различным языкам и культурным требованиям. Это позволяет пользователям получить опыт, соответствующий...
Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
0
2
805
3
Перейти к ответу Данный вопрос помечен как решенный

Ответы 3

Позвоните после этого

override func layoutSubviews() {
//here call round func 
self.layoutIfNeeded()
super.layoutSubviews()

}

используйте функцию viewDidLayoutSubviews и вызовите свою функцию внутри, чтобы превратить ее в круглый угол.

Пример :

override func viewDidLayoutSubviews() {
        super.viewDidLayoutSubviews()
        headerView.roundedButtonForTopRightTopLeft()
        view.setNeedsLayout()
        view.setNeedsDisplay()
    }
    extension UIView {
        func roundedButtonForTopRightTopLeft(){
            let maskPath1 = UIBezierPath(roundedRect: bounds,
                                         byRoundingCorners: [.topRight , .topLeft],
                                         cornerRadii: CGSize(width: 8, height: 8))
            let maskLayer1 = CAShapeLayer()
            maskLayer1.frame = bounds
            maskLayer1.path = maskPath1.cgPath
            layer.mask = maskLayer1
        }
}

Это закруглит 2 из 4 углов, но не даст эффекта, который будет после OP (все 4 угла закруглены, но с разным радиусом для верхнего и нижнего углов.

Duncan C 11.06.2018 17:56
Ответ принят как подходящий

Я не верю, что существует какой-либо системный вызов для создания закругленного прямоугольника с разными радиусами углов для каждого угла. Функция UIBezierPath(roundedRect:byRoundingCorners:cornerRadii:), которую вы используете, создаст прямоугольник с закругленными углами, некоторые из которых закруглены, а некоторые нет, но все углы, которые вы просите округлить, будут иметь одинаковый радиус.

Если вы хотите создать путь с разными углами, округленными до разных радиусов, я почти уверен, что вам придется построить такой путь самостоятельно, используя дуги для каждого угла и линейные сегменты для плоских сторон скругленного прямоугольника. (Вы должны нарисовать замкнутый путь, состоящий из дуги с углом / 2, затем отрезка линии и повторить это 4 раза. Центром каждой дуги будет тот угол прямоугольника, вставленный радиусом угла в оба измерения. Это помогает изобразить это на миллиметровой бумаге.)

Обновлено:

Немного покопавшись, я нашел этот пост, который включает код для создания закругленного прямоугольника с различным радиусом угла для каждого угла:

IOS: возможно скругление радиуса с разными значениями в каждом углу

Другие вопросы по теме