2015-07-03 14 views
9

udało mi się utworzyć zaokrąglone narożniki, ale mam problemy z pierwszym zaokrąglony narożnik (prawy dolny)Jak dodać zaokrąglony róg do niestandardowego prostokąta UIBezierPath?

Pytanie:

  • Mogę dodać metodę (addArcWithCenter) przed (moveToPoint) metoda ?
  • Jak mogę pozbyć się linii prostej na początku prostokąta (prawy dolny róg)?

tutaj jest mój kod na zamówienie prostokąta i zrzut ekranu:

let path = UIBezierPath() 
path.moveToPoint(CGPoint(x: 300, y: 0)) 
path.addArcWithCenter(CGPoint(x: 300-10, y: 50), radius: 10 , startAngle: 0 , endAngle: CGFloat(M_PI/2) , clockwise: true) //1st rounded corner 
path.addArcWithCenter(CGPoint(x: 200, y: 50), radius:10, startAngle: CGFloat(2 * M_PI/3), endAngle:CGFloat(M_PI) , clockwise: true)// 2rd rounded corner 
path.addArcWithCenter(CGPoint(x: 200, y: 10), radius:10, startAngle: CGFloat(M_PI), endAngle:CGFloat(3 * M_PI/2), clockwise: true)// 3rd rounded corner 
// little triangle at the bottom 
path.addLineToPoint(CGPoint(x:240 , y:0)) 
path.addLineToPoint(CGPoint(x: 245, y: -10)) 
path.addLineToPoint(CGPoint(x:250, y: 0)) 
path.addArcWithCenter(CGPoint(x: 290, y: 10), radius: 10, startAngle: CGFloat(3 * M_PI/2), endAngle: CGFloat(2 * M_PI), clockwise: true) 
path.closePath() 

enter image description here

+0

Więc co reszta rzeczywiście uzyskać podobny efekt. – NSDeveloper

Odpowiedz

5

Nevermind, faktycznie znalazłem rozwiązanie.

Zamiast uruchamiania kodu z jednej prostej:

path.moveToPoint(CGPoint(x: 300, y: 0)) 

I zamiast zacząć z łuku (prawy górny):

path.addArcWithCenter(CGPoint(x: 300-10, y: 50), radius: 10 , startAngle: 0 , endAngle: CGFloat(M_PI/2) , clockwise: true) //1st rounded corner 

i robiąc to, mam cztery zaokrąglone narożniki i Po prostu muszę dodać linię prostą na końcu kodu tuż przed:

path.closePath() 

Oto dorsz e oraz zrzut ekranu:

let path = UIBezierPath() 
path.addArcWithCenter(CGPoint(x: 300-10, y: 50), radius: 10 , startAngle: 0 , endAngle: CGFloat(M_PI/2) , clockwise: true) //1st rounded corner 
path.addArcWithCenter(CGPoint(x: 200, y: 50), radius:10, startAngle: CGFloat(2 * M_PI/3), endAngle:CGFloat(M_PI) , clockwise: true)// 2rd rounded corner 
path.addArcWithCenter(CGPoint(x: 200, y: 10), radius:10, startAngle: CGFloat(M_PI), endAngle:CGFloat(3 * M_PI/2), clockwise: true)// 3rd rounded corner 
// little triangle 
path.addLineToPoint(CGPoint(x:240 , y:0)) 
path.addLineToPoint(CGPoint(x: 245, y: -10)) 
path.addLineToPoint(CGPoint(x:250, y: 0)) 
path.addArcWithCenter(CGPoint(x: 290, y: 10), radius: 10, startAngle: CGFloat(3 * M_PI/2), endAngle: CGFloat(2 * M_PI), clockwise: true) 
path.addLineToPoint(CGPoint(x:300 , y:50)) 
path.closePath() 

enter image description here

+1

Cieszę się, że to znalazłeś. Tak właśnie opisałem. : D – Fogmeister

+1

Aby to poprawić, należy przenieść promień, wysokość i szerokość do zmiennych. W ten sposób możesz sprawić, że bańka będzie miała dowolny rozmiar i będzie miała dowolny promień zaokrąglenia, zmieniając tylko jedną wartość. – Fogmeister

+0

Czy należy wstawić zmienne xiy? Ale różnią się one od jednej linii kodu do drugiej. Czy możesz wyjaśnić więcej? Dzięki – AziCode

1

Nie możesz tego zrobić automatycznie. Trzeba skracać linie, a następnie używać łuków o promieniu, który ma być promieniem naroża.

So. Zamiast dodawać linię do x, y dodajesz linię do x-promienia, y. Następnie dodaj łuk. Następnie następna linia zaczyna się od x, y + promień.

+0

Czy możesz pokazać mi przykład? – AziCode

+1

@AziCode Mogę jutro. Teraz jest 1:30. :-) – Fogmeister

14

Myślę, że to, co robisz, jest zbyt skomplikowane. UIBezierPath daje UIBezierPath(roundedRect:), więc dlaczego nie używać? Obrysuj zaokrąglony prostokąt; wymazać miejsce, w którym zamierzasz umieścić mały trójkąt; dodaj trójkąt; wypełnij ścieżkę złożoną; i pociągnij brakujące dwie strony trójkąta. Tak (to tylko niektóre kodu I stało się, że leżące wokół - należy zmienić numery, aby pasowały do ​​kształtu, oczywiście):

let con = UIGraphicsGetCurrentContext() 
CGContextTranslateCTM(con, 10, 10) 
UIColor.blueColor().setStroke() 
UIColor.blueColor().colorWithAlphaComponent(0.4).setFill() 
let p = UIBezierPath(roundedRect: CGRectMake(0,0,250,180), cornerRadius: 10) 
p.stroke() 
CGContextClearRect(con, CGRectMake(20,170,10,11)) 
let pts = [ 
    CGPointMake(20,180), CGPointMake(20,200), 
    CGPointMake(20,200), CGPointMake(30,180) 
] 
p.moveToPoint(pts[0]) 
p.addLineToPoint(pts[1]) 
p.addLineToPoint(pts[3]) 
p.fill() 
CGContextStrokeLineSegments(con, pts, 4) 

enter image description here

Powiązane problemy