Алмазоподобный UIView

Я пытаюсь создать UIView с углами в форме ромба, как показано на рисунке:

алмаз

Я знаком с закруглением углов:

myView.layer.cornerRadius = 10

Однако я хочу другую форму. Как я мог создать этот эффект? Спасибо за вашу помощь!


person Pranav Wadhwa    schedule 22.04.2016    source источник
comment
Переопределить drawRect:.   -  person rmaddy    schedule 23.04.2016
comment
Извините, я никогда не использовал этот метод раньше. Не могли бы вы предоставить мне пример кода? Спасибо   -  person Pranav Wadhwa    schedule 23.04.2016
comment
Прочтите Просмотреть руководство по программированию для iOS   -  person rmaddy    schedule 23.04.2016
comment
Это руководство хорошее, но слишком большое. Если вы просто хотите решить эту конкретную проблему, используйтеUIBezierPath   -  person Alexander Doloz    schedule 23.04.2016
comment
Я никогда не работал с рамками для рисования и т. д. Не могли бы вы помочь мне с кодом?   -  person Pranav Wadhwa    schedule 23.04.2016
comment
Прочтите раздел о пользовательских представлениях и использовании drawRect:.   -  person rmaddy    schedule 23.04.2016
comment
Ознакомьтесь с этим замечательным демонстрационным проектом, посвященным пользовательским представлениям фигур и выполнению hitTest. на них.   -  person UditS    schedule 23.04.2016


Ответы (1)


Лучший способ решить такую ​​проблему — использовать CAShapeLayer. Вот что может сработать: вставьте его на игровую площадку и посмотрите, как он обрезает углы.

import UIKit
import XCPlayground

extension UIView {
    func maskCorners(inset: CGFloat) {
        let path = UIBezierPath()
        path.moveToPoint(CGPoint(x: bounds.origin.x + inset,y: 0))
        path.addLineToPoint(CGPoint(x: CGRectGetMaxX(bounds) - inset,y: 0))
        path.addLineToPoint(CGPoint(x: CGRectGetMaxX(bounds), y: bounds.origin.y + inset))
        path.addLineToPoint(CGPoint(x: CGRectGetMaxX(bounds), y: CGRectGetMaxY(bounds) - inset))
        path.addLineToPoint(CGPoint(x: CGRectGetMaxX(bounds) - inset,y: CGRectGetMaxY(bounds)))
        path.addLineToPoint(CGPoint(x: bounds.origin.x + inset,y: CGRectGetMaxY(bounds)))
        path.addLineToPoint(CGPoint(x: 0,y: CGRectGetMaxY(bounds) - inset))
        path.addLineToPoint(CGPoint(x: 0,y: bounds.origin.y + inset))
        path.addLineToPoint(CGPoint(x: bounds.origin.x + inset,y: 0))

        let mask = CAShapeLayer()
        mask.frame = bounds
        mask.path = path.CGPath
        layer.mask = mask
    }
}

let diamond = UIView(frame: CGRect(x:0, y: 0, width: 100, height:100))
diamond.backgroundColor = UIColor.redColor()
XCPlaygroundPage.currentPage.liveView = diamond
diamond.maskCorners(25)
person Alex Curylo    schedule 22.04.2016
comment
возможно ли, что вы могли бы показать мне, как создать функцию с этим, чтобы я мог использовать его для многих представлений. Я пробовал сам, но не смог добиться такого же результата. - person Pranav Wadhwa; 23.04.2016
comment
Спасибо еще раз. Это именно то, что я искал! - person Pranav Wadhwa; 23.04.2016