2016-06-07 7 views
3

Как проверить UIBezierPath закрыт путь или нет (замкнутый путь подобен замкнутому контуру, означает, что он создает любую форму, такую ​​как треугольник, квадрат, многоугольник и т. Д.), А если он закрыт, то заполняется только путь?Проверить UIBezierPath закрыто или нет

Нижеследующее представляет собой область, где она должна заполнять форму; последняя 2 форма определяющего замкнутого контура и простой замкнутый контур, который только цвет может быть заполнен:

enter image description here

Image Source

Ниже мой код для того же, Есть 4 Площади в нем, но заполняет всего 3 квадрата; также хочу знать, можно ли найти область заполненной площади в квадратных футах, так как я получаю 4 квадрата здесь, как проверить общую площадь, которую он покрыл на 4 квадрата?

UIBezierPath *mainPath =[UIBezierPath bezierPath]; 
[mainPath moveToPoint:CGPointMake(50, 100)]; 
[mainPath addLineToPoint:CGPointMake(0, 100)]; 
[mainPath addLineToPoint:CGPointMake(0, 150)]; 
[mainPath addLineToPoint:CGPointMake(50, 150)]; 
[mainPath addLineToPoint:CGPointMake(50, 200)]; 
[mainPath addLineToPoint:CGPointMake(100, 200)]; 
[mainPath addLineToPoint:CGPointMake(100, 150)]; 
[mainPath addLineToPoint:CGPointMake(50, 150)]; 
[mainPath addLineToPoint:CGPointMake(50, 100)]; 
[mainPath addLineToPoint:CGPointMake(100, 100)]; 
[mainPath addLineToPoint:CGPointMake(150, 100)]; 
[mainPath addLineToPoint:CGPointMake(150, 150)]; 
[mainPath addLineToPoint:CGPointMake(100, 150)]; 
[mainPath addLineToPoint:CGPointMake(100, 100)]; 
CAShapeLayer *shapeLayer = [[CAShapeLayer alloc] init]; 
shapeLayer.lineWidth = 5.0; 
shapeLayer.strokeColor = [UIColor blueColor].CGColor; 
shapeLayer.path =mainPath.CGPath; 
shapeLayer.fillColor = [[UIColor redColor] colorWithAlphaComponent:0.5].CGColor; 
[[self.view layer] addSublayer:shapeLayer]; 

ответ

0

Почему вы не используете mainPath.closePath он автоматически закроет путь для вас и заполнить. Если вы хотите иметь больше информации о автоматическом закрытии пути или вручную, вы можете посмотреть here, он сказал, что:

Разница в том, что метод [closePath] фактически добавляет дополнительный элемент пути к подстилающей CGPath который поддерживает UIBezierPath.

Если вы используете [closePath], а затем дополнительный CGPathElement с типом из kCGPathElementCloseSubpath будет приложенном к концу пути сразу после этого сегмента последней строки.

Для области, охватываемой, вы можете получить ограничительную рамку вашего UIBezierPath, но я думаю, что это может быть более простым для вас, чтобы иметь различную UIBezierPath (по одному для каждого из вашего квадрата), а затем вычислить ограничивающий прямоугольник для каждый квадрат. Если вы хотите иметь ограничительную рамку вашего пути:

let bounds = CGPathGetBoundingBox(yourPath.CGPath) 
+2

Ну, все линии добавляются динамически, и я не хочу closePath; Я просто хочу проверить, что он закрыт или нет. и взяв вокруг области, тогда форма могла бы быть любым подобным треугольником или так, поэтому область могла быть подсчитана для всех разных форм в квадратных футах. –

1

Я ответил на аналогичный вопрос о CGPathhere. Поскольку вы можете получить CGPath для UIBezierPath, я думаю, что он здесь также применим. Это для Swift 3.x. Я занял сильно от this answer, добавив функцию isClosed().

extension CGPath { 

func isClosed() -> Bool { 
    var isClosed = false 
    forEach { element in 
     if element.type == .closeSubpath { isClosed = true } 
    } 
    return isClosed 
} 

func forEach(body: @convention(block) (CGPathElement) -> Void) { 
    typealias Body = @convention(block) (CGPathElement) -> Void 
    let callback: @convention(c) (UnsafeMutableRawPointer, UnsafePointer<CGPathElement>) -> Void = { (info, element) in 
     let body = unsafeBitCast(info, to: Body.self) 
     body(element.pointee) 
    } 
    print(MemoryLayout.size(ofValue: body)) 
    let unsafeBody = unsafeBitCast(body, to: UnsafeMutableRawPointer.self) 
    self.apply(info: unsafeBody, function: unsafeBitCast(callback, to: CGPathApplierFunction.self)) 
} 
} 

Вот как вы его используете:

myBezierPath.cgPath.isClosed()