So setzen Sie das Bild schnell in einen Kreis


79

Wie kann ich schnell ein Kreisbild erstellen?

Mein ViewController:

import UIKit
import Foundation

class FriendsViewController : UIViewController{

    @IBOutlet weak var profilPicture: UIImageView!

    override func viewDidLoad() {
        super.viewDidLoad()
        profilPicture = UIImageView(frame: CGRectMake(0, 0, 100, 100))
    }
}

Ich profilPicture = UIImageView(frame: CGRectMake(0, 0, 100, 100))mache nichts ..

Beispiel: http://www.appcoda.com/ios-programming-circular-image-calayer/


3
Was bedeutet "Bild in Kreis setzen"? Können Sie genauer beschreiben, was Sie tun möchten? Vielleicht ein Bild von den gewünschten Ergebnissen zeichnen?
Matt

1
profilPicture = UIImageView(frame: CGRectMake(0, 0, 100, 100))tut nicht "nichts". Es macht definitiv etwas! Aber was es tut, ist ziemlich unglücklich. Es erstellt eine UIImageView und weist sie einer schwachen Referenz zu. Die Bildansicht ist leer. es hat kein Bild. Darüber hinaus ist die Referenz schwach, sodass die Bildansicht sofort in einer Rauchwolke verschwindet. An diesem Code ist schwer zu erkennen, was Sie sich hier vorgestellt haben.
Matt

Ich möchte dieses Ergebnis machen: appcoda.com/ios-programming-circular-image-calayer
Pixel

Jetzt haben Sie einen Link zu einem Tutorial hinzugefügt, der Ihnen erklärt, wie es geht. Folgen Sie einfach den Anweisungen in diesem Tutorial! Sie haben Ihre eigene Frage beantwortet.
Matt

Ich arbeite schnell, wenn ich die Anweisungen im Tutoriel mache, nichts anhängen: S
Pixel

Antworten:


220
import UIKit

class ViewController: UIViewController {
  @IBOutlet weak var image: UIImageView!

  override func viewDidLoad() {
    super.viewDidLoad()

    image.layer.borderWidth = 1
    image.layer.masksToBounds = false
    image.layer.borderColor = UIColor.black.cgColor
    image.layer.cornerRadius = image.frame.height/2
    image.clipsToBounds = true
}

Wenn Sie es auf einer Erweiterung wollen

import UIKit

extension UIImageView {

    func makeRounded() {

        self.layer.borderWidth = 1
        self.layer.masksToBounds = false
        self.layer.borderColor = UIColor.black.cgColor
        self.layer.cornerRadius = self.frame.height / 2
        self.clipsToBounds = true
    }
}

Das ist alles was du brauchst ....


8
das image.clipsToBounds = truewar genau das, was ich brauchte :-)
Dave Kliman

4
Es funktioniert nicht, wenn UIImageView aufgrund von Einschränkungen wachsen oder schrumpfen kann. In diesem Fall muss es in viewDidLayoutSubviews ()
Georgevik

Ich fand heraus, dass das Hinzufügen des Rahmens um das abgerundete Bild einen Geist des ursprünglichen Rechtecks ​​auf dem Bildschirm hinterlässt. Dies war in Simulator 10.0 sichtbar und trat möglicherweise nicht auf einem realen Gerät auf, hielt es jedoch für wichtig genug, um es hier zu erwähnen.
ZacSketches

image.layer.borderColor = UIColor.blackColor().CGColor verwandelt sich in image.layer.borderColor = UIColor.black.cgColor
George Pazdral

Arbeiten Sie perfekt in schnell 4. 👍🏻
iGhost

35

Sie können einfach eine Erweiterung erstellen:

import UIKit

extension UIImageView {

   func setRounded() {
      let radius = CGRectGetWidth(self.frame) / 2
      self.layer.cornerRadius = radius
      self.layer.masksToBounds = true
   }
}

und benutze es wie folgt:

imageView.setRounded()

16

Basierend auf der Antwort von @DanielQ

Swift 4 und Swift 3

import UIKit

extension UIImageView {

    func setRounded() {
        self.layer.cornerRadius = (self.frame.width / 2) //instead of let radius = CGRectGetWidth(self.frame) / 2
        self.layer.masksToBounds = true
    }
}

Sie können es in jedem verwenden ViewControllermit:

imageView.setRounded()

12

Wenn Sie in Swift ein UIImageView-Rundschreiben erstellen möchten, können Sie einfach diesen Code verwenden:

imageView.layer.cornerRadius = imageView.frame.height / 2
imageView.clipsToBounds = true

2
Wenn Sie dies nicht tun image.clipsToBounds = true, wird das Bild nicht skaliert.
Jean-Baptiste Louazel

7
@ Tom Spee Wenn ich den Eckenradius auf die Hälfte der Bildbreite einstelle, erhalte ich ein rautenförmiges Bild und keinen Knöchel. Irgendeine Idee warum das wäre ??
user2363025

@ user2363025 Ich vermute, Sie haben es inzwischen herausgefunden, aber haben Sie bestätigt, dass Sie die imageView und nicht das Bild verwendet haben ?
Scott Corscadden

@ ScottCorscadden Entschuldigung Scott, ich habe nicht den alten Code, auf den ich zurückblicken kann.
user2363025

Vielleicht etwas spät, aber eine Diamantform kann durch das automatische Layout verursacht werden. Möglicherweise müssen Sie self.view.layoutIfNeeded()vorher anrufen .
Tom Spee

6

Ich weiß nicht, ob dies jemandem hilft, aber ich hatte eine Weile mit diesem Problem zu kämpfen. Keine der Online-Antworten hat mir geholfen. Für mich war das Problem, dass ich im Storyboard unterschiedliche Höhen und Breiten für das Bild festgelegt hatte. Ich habe jede Lösung auf dem Stapel ausprobiert und es stellte sich heraus, dass es so einfach war. Nachdem ich beide auf 200 eingestellt hatte, war mein Kreisprofil perfekt. Das war damals Code in meiner VC.

profileImage2.layer.cornerRadius = profileImage2.frame.size.width/2
    profileImage2.clipsToBounds = true

Süss! Vielen Dank. Dies sollte die Antwort sein. Zwei klare Codezeilen. Keine Notwendigkeit, Klassen oder etwas anderes zu verlängern.
user3286381

4

Für Swift 4 :

import UIKit

extension UIImageView {

func makeRounded() {
    let radius = self.frame.width/2.0
    self.layer.cornerRadius = radius
    self.layer.masksToBounds = true
   }
}

3

Alle obigen Antworten konnten das Problem in meinem Fall nicht lösen. Mein ImageViewwurde in einem kundenspezifischen platziert UITableViewCell. Deshalb hatte ich die layoutIfNeeded()Methode auch von hier aus aufgerufen . Beispiel:

 class NameTableViewCell:UITableViewCell,UITextFieldDelegate { ...

 override func awakeFromNib() {

    self.layoutIfNeeded()
    profileImageView.layoutIfNeeded()

    profileImageView.isUserInteractionEnabled = true
    let square = profileImageView.frame.size.width < profileImageView.frame.height ? CGSize(width: profileImageView.frame.size.width, height: profileImageView.frame.size.width) : CGSize(width: profileImageView.frame.size.height, height:  profileImageView.frame.size.height)
    profileImageView.addGestureRecognizer(tapGesture)
    profileImageView.layer.cornerRadius = square.width/2
    profileImageView.clipsToBounds = true;
}

2

Dieser Weg ist der kostengünstigste und hält Ihre Bildansicht immer abgerundet:

class RoundedImageView: UIImageView {

    override init(frame: CGRect) {
        super.init(frame: frame)

        clipsToBounds = true
    }

    required init?(coder aDecoder: NSCoder) {
        super.init(coder: aDecoder)

        clipsToBounds = true
    }

    override func layoutSubviews() {
        super.layoutSubviews()

        assert(bounds.height == bounds.width, "The aspect ratio isn't 1/1. You can never round this image view!")

        layer.cornerRadius = bounds.height / 2
    }
}

In den anderen Antworten werden Sie aufgefordert, Ansichten basierend auf Rahmenberechnungen, die in einer UIViewControllers- viewDidLoad()Methode festgelegt wurden, gerundet zu machen . Dies ist nicht korrekt , da nicht sicher ist, wie der endgültige Frame aussehen wird.


1
Schlagen Sie vor, Sie könnten auch @IBDesignable
Fattie

1

Zuerst müssen Sie die gleiche Breite und Höhe einstellen, um Circular ImageView zu erhalten. Unten stelle ich Breite und Höhe auf 100.100 ein. Wenn Sie die gleiche Breite und Höhe entsprechend Ihrer gewünschten Größe einstellen möchten, stellen Sie dies hier ein.

 var imageCircle = UIImageView(frame: CGRectMake(0, 0, 100, 100))

Dann müssen Sie Höhe / 2 für den Eckenradius einstellen

 imageCircle.layer.cornerRadius = imageCircle.frame.size.height/2
 imageCircle.layer.borderWidth = 1
 imageCircle.layer.borderColor = UIColor.blueColor().CGColor
 imageCircle.clipsToBounds = true
 self.view.addSubview(imageCircle)

1

Für Swift3 / Swift4-Entwickler:

let radius = yourImageView.frame.width / 2
yourImageView.layer.cornerRadius = radius
yourImageView.layer.masksToBounds = true

Nicht ganz, ich denke, er fügt ImageView eine Erweiterung hinzu. Dadurch wird die Instanz der Klasse direkt geändert. Wenn es nicht hilfreich ist, kann ich es abbauen.
Achintya Ashok

1
struct CircleImage: View {
    var image: Image

    var body: some View {
        image
           .clipShape(Circle())
    }
}

Dies ist richtig für SwiftUI


0
// code to make the image round


import UIKit

extension UIImageView {
public func maskCircle(anyImage: UIImage) {


    self.contentMode = UIViewContentMode.ScaleAspectFill
    self.layer.cornerRadius = self.frame.height / 2
    self.layer.masksToBounds = false
    self.clipsToBounds = true




    // make square(* must to make circle),
    // resize(reduce the kilobyte) and
    // fix rotation.
    //        self.image = prepareImage(anyImage)
}
}

// um die Funktion vom View Controller aufzurufen

self.imgCircleSmallImage.maskCircle(imgCircleSmallImage.image!)

0
imageView.layer.cornerRadius = imageView.frame.height/2
imageView.clipToBounds = true

-1

Wenn Ihr Bild gerundet ist, hat es eine Höhe und Breite von genau derselben Größe (dh 120). Sie nehmen einfach die Hälfte dieser Zahl und verwenden sie in Ihrem Code (image.layer.cornerRadius = 60).

Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.