2016-12-08 3 views
0

둥근 모서리가있는 축소판 이미지를 만들고 iOS의 이미지 하단에 막대를 만들려고합니다. iOS에서 둥근 모서리 이미지를 그릴 때 이상한 톱니가 발생했습니다.

extension UIImage { 
    func thumbnails(with options: SomeDrawingOptions) -> UIImage? { 
    // ... 

    UIGraphicsBeginImageContextWithOptions(targetRect.size, false, 0) 
    defer { 
     UIGraphicsEndImageContext() 
    } 
    let context = UIGraphicsGetCurrentContext()! 

    UIColor.white.setFill() 
    context.fill(targetRect) 

    UIBezierPath(roundedRect: targetRect, cornerRadius: 8).addClip() 

    // Drawing image 
    draw(in: targetRect) 

    // Drawing a transparent mask 
    UIColor.black.withAlphaComponent(0.4).setFill() 
    context.fill(targetRect) 

    // Drawing bar 
    UIColor.white.setFill() 
    context.fill(someBarRect) 

    return UIGraphicsGetImageFromCurrentImageContext() 
    } 
} 

마지막으로 그냥 다음 스냅 샷의 것과 같은 날카로운 모서리가 둥근 이미지를 가지고 :

와 나는 다음과 같은 코드가 있습니다.

Sharp Rounded Corners

어떤 조언 둥근 모서리의 톱니를 제거하기 위해?

======= 솔루션 ======

감사합니다 @ wj2061에 대한 답을 추가, 문제 해결. 그리고 여기에 코드입니다 :

extension UIImage { 
    func thumbnails(with options: SomeDrawingOptions) -> UIImage? { 
    // ... 

    let targetRect = options.targetRect 
    let clippedPath = UIBezierPath(roundedRect: targetRect, cornerRadius: 8) 

    func makeImage() -> UIImage? { 
     UIGraphicsBeginImageContextWithOptions(targetRect.size, false, 0) 
     defer { UIGraphicsEndImageContext() } 
     let context = UIGraphicsGetCurrentContext()! 

     draw(in: targetRect) 

     // Drawing a transparent mask 
     UIColor.black.withAlphaComponent(0.4).setFill() 
     context.fill(targetRect) 

     // Drawing bar 
     UIColor.white.setFill() 
     context.fill(someBarRect) 

     return UIGraphicsGetImageFromCurrentContext() 
    } 

    UIGraphicsBeginImageContextWithOptions(targetRect.size, false, 0) 
    defer { UIGraphicsEndImageContext() } 
    let context = UIGraphicsGetCurrentContext()! 

    // Drawing image 
    clippedPath.addClip() 
    makeImage()?.draw(in: targetRect) 

    return UIGraphicsGetImageFromCurrentImageContext() 
    } 
} 
+0

본되어서는 안된다) (GSTATE 복원 후 – mrahmiao

답변

1

그래서이 함정은 UIBezierPath(roundedRect: targetRect, cornerRadius: 8).addClip() 함께 할 수있는 뭔가가 좋아 보인다, 나는, 1 단계에서 이미지에 마스크를 추가 단계 코드는 같다 2의 이미지에 모서리를 추가하려고 화상의 바 색 용기 뷰의 배경색과 동일한 경우, 라운딩 @ 매트이

extension UIImage { 
func thumbnails() -> UIImage? { 
    let targetRect = CGRect(x: 0, y: 0, width: 100, height: 150) 

    UIGraphicsBeginImageContextWithOptions(targetRect.size, false, 0) 
    defer { 
     UIGraphicsEndImageContext() 
    } 

    UIBezierPath(roundedRect: targetRect, cornerRadius: 8).addClip() 

    let makedImage = self.makedImage() 

    makedImage?.draw(in : targetRect) 

    return UIGraphicsGetImageFromCurrentImageContext() 
} 


func makedImage()->UIImage?{ 
    let targetRect = CGRect(x: 0, y: 0, width: 100, height: 150) 
    let someBarRect = CGRect(x: 0, y: 100, width: 100, height: 50) 

    UIGraphicsBeginImageContextWithOptions(targetRect.size, false, 0) 
    defer { 
     UIGraphicsEndImageContext() 
    } 
    let context = UIGraphicsGetCurrentContext()! 

    draw(in : targetRect) 


    // Drawing a transparent mask 
    UIColor.black.withAlphaComponent(0.4).setFill() 
    context.fill(targetRect) 

    // Drawing bar 
    UIColor.white.withAlphaComponent(1).setFill() 
    context.fill(someBarRect) 

    return UIGraphicsGetImageFromCurrentImageContext() 
} 
} 
+0

(이 경우에, 수집 뷰 'S) , 막대는 잘리지 않으며 바닥에있는 두 개의 둥근 모서리가 사라집니다. – mrahmiao

+0

'UIGraphicsGetCurrentContext.clear()'가 당신이 찾고있는 메소드 인 것처럼 보입니다. 또한 순서 나 'context.fill (targetRect)'을 변경하여 이미지 상단이 흰색이 아니게 만듭니다. – wj2061

+0

실제로 작동했습니다. 톱니가 제거되었습니다. 그러나 투명 색상의 막대는 칠할 수 없습니다. 투명 색을 채우지 만 투명한 효과는 볼 수 없습니다. – mrahmiao