2014-04-06 4 views
6

Ich möchte einen einfachen Knoten mit facebook Profilbild eines Benutzers erstellen, wo das Bild abgerundete Ecken (oder einen vollständigen Kreis) hat. Ich schaffe den Knoten wie folgt:So erstellen Sie Sktexture mit abgerundeten Ecken ohne Verwendung einer Maske

SKNode *friend = [[SKNode alloc] init]; 

SKTexture *texture = [SKTexture textureWithImage:user[@"fbProfilePicture"]];     
SKSpriteNode *profilePic = [SKSpriteNode spriteNodeWithTexture:texture]; 

[friend addChild:profilePic]; 

ich keine ordnungsgemäße Dokumentation finden konnten, um das Bild mit abgerundeten Ecken, die nicht mit SKCropNode (was eine schlechte Abhilfe zu sein scheint), dies zu schaffen

+0

Warum nicht einen zweischichtigen Knoten erstellen: Benutzeravatar + PNG-Bild? – AndrewShmig

+0

Da ich das Bild von Facebook nehme, muss ich es zuschneiden, wenn ich es bekomme. Haben Sie einen Vorschlag, wie Sie das erreichen können? – Yuvals

Antwort

5

Versuchen:

// your profile picture 
UIImage *fbProfilePicture = [UIImage imageNamed:@"fbProfilePicture"]; 

// create the image with rounded corners 
UIGraphicsBeginImageContextWithOptions(fbProfilePicture.size, NO, 0); 
CGRect rect = CGRectMake(0, 0, fbProfilePicture.size.width, fbProfilePicture.size.height); 
[[UIBezierPath bezierPathWithRoundedRect:rect cornerRadius:20.0] addClip]; 
[fbProfilePicture drawInRect:rect]; 
UIImage *roundedImage = UIGraphicsGetImageFromCurrentImageContext(); 
UIGraphicsEndImageContext(); 

// use the roundedImage as texture for your sprite  
SKTexture *texture = [SKTexture textureWithImage:roundedImage]; 
SKSpriteNode *profilePic = [SKSpriteNode spriteNodeWithTexture:texture size:CGSizeMake(fbProfilePicture.size.width, fbProfilePicture.size.height)]; 

[self addChild:profilePic]; 

Der abgerundete Eckteil stammt aus this answer.

+0

Sehr gut, das tut genau das, was ich brauchte! – Yuvals

6

So sieht es in Swift durch die Übersetzung der obigen Antwort, Sebastian's Antwort. Die Methode erhält den Namen des Bildes und gibt einen Knoten mit abgerundeten Ecken zurück.

class func roundSquareImage(imageName: String) -> SKSpriteNode { 
      let originalPicture = UIImage(named: imageName) 
      // create the image with rounded corners 
      UIGraphicsBeginImageContextWithOptions(originalPicture!.size, false, 0) 
      let rect = CGRectMake(0, 0, originalPicture!.size.width, originalPicture!.size.height) 
      let rectPath : UIBezierPath = UIBezierPath(roundedRect: rect, cornerRadius: 30.0) 
      rectPath.addClip() 
      originalPicture!.drawInRect(rect) 
      let scaledImage = UIGraphicsGetImageFromCurrentImageContext() 
      UIGraphicsEndImageContext(); 

      let texture = SKTexture(image: scaledImage) 
      let roundedImage = SKSpriteNode(texture: texture, size: CGSizeMake(originalPicture!.size.width, originalPicture!.size.height)) 
      roundedImage.name = imageName 
      return roundedImage 
     } 
+0

Irgendwelche Performance-Probleme mit diesem Ansatz? Danke für die Übersetzung! – Crashalot

1

Für 2017 ...

class YourSprite: SKSpriteNode { 

    func yourSetupFunction() { 

      texture = SKTexture(image: UIImage(named: "cat")!.circleMasked!) 

Es ist so einfach ...

enter image description here

-Code für circleMasked:

(Alle Projekte, die mit Bildern umgehen werden brauche das sowieso.)

extension UIImage { 

    var isPortrait: Bool { return size.height > size.width } 
    var isLandscape: Bool { return size.width > size.height } 
    var breadth:  CGFloat { return min(size.width, size.height) } 
    var breadthSize: CGSize { return CGSize(width: breadth, height: breadth) } 
    var breadthRect: CGRect { return CGRect(origin: .zero, size: breadthSize) } 

    var circleMasked: UIImage? { 

     UIGraphicsBeginImageContextWithOptions(breadthSize, false, scale) 
     defer { UIGraphicsEndImageContext() } 

     guard let cgImage = cgImage?.cropping(to: CGRect(origin: 
      CGPoint(
       x: isLandscape ? floor((size.width - size.height)/2) : 0, 
       y: isPortrait ? floor((size.height - size.width)/2) : 0), 
      size: breadthSize)) 
     else { return nil } 

     UIBezierPath(ovalIn: breadthRect).addClip() 
     UIImage(cgImage: cgImage, scale: 1, orientation: imageOrientation) 
      .draw(in: breadthRect) 
     return UIGraphicsGetImageFromCurrentImageContext() 
    } 

// classic 'circleMasked' stackoverflow fragment 
// courtesy Leo Dabius /a/29047372/294884 
} 
Verwandte Themen