IOS: utwórz UIImage lub UIImageView z zaokrąglonymi narożnikami

98

Czy można stworzyć UIImagelub UIImageViewz zaokrąglonymi narożnikami? Ponieważ chcę wziąć UIImagei pokazać to w środku UIImageView, ale nie wiem, jak to zrobić.

jazda na rowerze jest lepsza
źródło

Odpowiedzi:

235

Tak to mozliwe.
Zaimportuj nagłówek QuartzCore ( #import <QuartzCore/QuartzCore.h>) i graj z layerwłaściwością UIImageView.

yourImageView.layer.cornerRadius = yourRadius;
yourImageView.clipsToBounds = YES;

Więcej informacji można znaleźć w dokumentacji klasowej CALayer .

yinkou
źródło
1
ok, to działa dla UIImageView, ale jeśli wstawię do tego UIImageView UIImage, to nie działa, jak mogę rozwiązać?
CyclingIsBetter
9
Nie zapomnij aktywować clipToBounds. yourImageView.clipsToBounds = YES;
yinkou
1
Jeśli ImageView znajdował się wewnątrz komórki scrollView lub tableView, clipsToBounds powoduje złą wydajność przewijania.
OzBoz
Testuję w ten sposób! Kosztują dużo pamięci!
LE SANG
Użyłem tego kodu w Swift 2.0 i działał poprawnie, dziękuję. Nawiasem mówiąc, zmieniłem TAK na prawdę.
lmiguelvargasf
54

Wypróbuj ten kod dla okrągłego obrazu Importuj strukturę QuartzCore w prosty sposób, aby utworzyć okrągły obraz

imageView.layer.backgroundColor=[[UIColor clearColor] CGColor];
imageView.layer.cornerRadius=20;
imageView.layer.borderWidth=2.0;
imageView.layer.masksToBounds = YES;
imageView.layer.borderColor=[[UIColor redColor] CGColor];

wprowadź opis obrazu tutaj

Muralikrishna
źródło
47

Cel C

-(UIImage *)makeRoundedImage:(UIImage *) image 
                      radius: (float) radius;
{
  CALayer *imageLayer = [CALayer layer];
  imageLayer.frame = CGRectMake(0, 0, image.size.width, image.size.height);
  imageLayer.contents = (id) image.CGImage;

  imageLayer.masksToBounds = YES;
  imageLayer.cornerRadius = radius;

  UIGraphicsBeginImageContext(image.size);
  [imageLayer renderInContext:UIGraphicsGetCurrentContext()];
  UIImage *roundedImage = UIGraphicsGetImageFromCurrentImageContext();
  UIGraphicsEndImageContext();

  return roundedImage;
}

Szybki 3

func makeRoundedImage(image: UIImage, radius: Float) -> UIImage {
    var imageLayer = CALayer()
    imageLayer.frame = CGRect(x: 0, y: 0, width: image.size.width, height: image.size.height)
    imageLayer.contents = image.cgImage

    imageLayer.masksToBounds = true
    imageLayer.cornerRadius = radius

    UIGraphicsBeginImageContext(image.size)
    imageLayer.render(in: UIGraphicsGetCurrentContext())
    var roundedImage = UIGraphicsGetImageFromCurrentImageContext()
    UIGraphicsEndImageContext()

    return roundedImage
}
Savas Adar
źródło
jak zrobić część centrum obrazu utworzyć kształt krzywej szczupły jak to możliwe pojęcie to proszę dać mi znać facet dla obiektywnego języka C
Ramani Hitesh
10
uiimageview.layer.cornerRadius = uiimageview.frame.size.height/2;
uiimageview.clipToBounds = YES;

#import <QuartzCore/QuartzCore.h>
Abdul Rehman Butt
źródło
2
Czym to się różni od innych odpowiedzi?
mmmmmm
3
@Mark uiimageview.frame.size.height/2;to prawdziwy klejnot, który sprawia, że ​​obraz ma idealny okrągły kształt, pełne koło.
Ans
Jak wymyślasz uiimageview.frame.size.height / 2? Czy możesz wyjaśnić?
Idrees Ashraf
@IdreesAshraf tutaj jest prosta logika .... promień połowy wysokości będzie zaczynał się od góry w środku do lewej środkowej. Robiąc łuk 45 stopni. więc mając taki łuk z 4 stron, widok będzie idealnym okręgiem.
Ans
1
@Ans Nie powiedzie się, jeśli mam obraz o różnej szerokości i wysokości. Możesz spróbować ...
Idrees Ashraf
3
// UIImageView+OSExt.h
#import <UIKit/UIKit.h>

@interface UIImageView (OSExt)
- (void)setBorder:(CGFloat)borderWidth color:(UIColor*)color;
@end

// UIImageView+OSExt.m
#import "UIImageView+OSExt.h"

@implementation UIImageView (OSExt)
- (void)layoutSublayersOfLayer:(CALayer *)layer
{
    for ( CALayer *sub in layer.sublayers )
    {
        if ( YES == [sub.name isEqual:@"border-shape"])
        {
            CGFloat borderHalf = floor([(CAShapeLayer*)sub lineWidth] * .5);
            sub.frame = layer.bounds;
            [sub setBounds:CGRectInset(layer.bounds, borderHalf, borderHalf)];
            [sub setPosition:CGPointMake(CGRectGetMidX(layer.bounds),
                                       CGRectGetMidY(layer.bounds))];
        }
    }
}

- (void)setBorder:(CGFloat)borderWidth color:(UIColor*)color
{
    assert(self.frame.size.width == self.frame.size.height);
    for ( CALayer *sub in [NSArray arrayWithArray:self.layer.sublayers] )
    {
        if ( YES == [sub.name isEqual:@"border-shape"])
        {
            [sub removeFromSuperlayer];
            break;
        }
    }

    CGFloat borderHalf = floor(borderWidth * .5);
    self.layer.cornerRadius = self.layer.bounds.size.width * .5;

    CAShapeLayer *circleLayer = [CAShapeLayer layer];
    self.layer.delegate = (id<CALayerDelegate>)self;
    circleLayer.name = @"border-shape";
    [circleLayer setBounds:CGRectInset(self.bounds, borderHalf, borderHalf)];
    [circleLayer setPosition:CGPointMake(CGRectGetMidX(self.layer.bounds),
                                         CGRectGetMidY(self.layer.bounds))];
    [circleLayer setPath:[[UIBezierPath bezierPathWithOvalInRect:circleLayer.bounds] CGPath]];
    [circleLayer setStrokeColor:color.CGColor];
    [circleLayer setFillColor:[UIColor clearColor].CGColor];
    [circleLayer setLineWidth:borderWidth];

    {
    circleLayer.shadowOffset = CGSizeZero;
    circleLayer.shadowColor = [[UIColor whiteColor] CGColor];
    circleLayer.shadowRadius = borderWidth;
    circleLayer.shadowOpacity = .9f;
    circleLayer.shadowOffset = CGSizeZero;
    }

    // Add the sublayer to the image view's layer tree
    [self.layer addSublayer:circleLayer];

    // old variant
    //CALayer *layer = self.layer;
    //layer.masksToBounds = YES;
    //layer.cornerRadius = self.frame.size.width * 0.5;
    //layer.borderWidth = borderWidth;
    //layer.borderColor = color;
}
@end

wprowadź opis obrazu tutaj

Roman Solodyashkin
źródło
Wygląda na to, że kawałek obrazu przecieka przez granicę. Nie jestem pewien, czy jest na to łatwe rozwiązanie…
John Gibb,
granica poprawiona
Roman Solodyashkin
2

Ustawienie cornerRadiusi clipsToBoundsjest właściwym sposobem, aby to zrobić. Jeśli jednak rozmiar widoku ulegnie zmianie, promień nie zostanie zaktualizowany. Aby uzyskać odpowiednie zachowanie przy zmianie rozmiaru i animacji, musisz utworzyć UIImageViewpodklasę.

class RoundImageView: UIImageView {
    override var bounds: CGRect {
        get {
            return super.bounds
        }
        set {
            super.bounds = newValue
            setNeedsLayout()
        }
    }

    override func layoutSubviews() {
        super.layoutSubviews()
        layer.cornerRadius = bounds.width / 2.0
        clipsToBounds = true
    }
}
orkoden
źródło
1

Spróbuj tego, aby uzyskać zaokrąglone rogi widoku obrazu, a także pokolorować rogi:

imageView.layer.cornerRadius = imageView.frame.size.height/2;
imageView.layer.masksToBounds = YES;
imageView.layer.borderColor = [UIColor colorWithRed:148/255. green:79/255. blue:216/255. alpha:1.0].CGColor;
imageView.layer.borderWidth=2;

Warunek *: wysokość i szerokość imageView muszą być takie same, aby uzyskać zaokrąglone rogi.

Md Rais
źródło
1
  1. layer.cornerRadius = imageviewHeight / 2

  2. layer.masksToBounds = true

Manish Mahajan
źródło
0

Jest to możliwe, ale radzę stworzyć przezroczysty obraz png (maskę) z zaokrąglonymi rogami i umieścić go nad sobą za pomocą UIImageView. Może to być szybsze rozwiązanie (na przykład jeśli potrzebujesz animacji lub przewijania).

Nik
źródło
0

Oto, jak ustawiłem mój zaokrąglony awatar na środku, zawiera widok:

-(void)setRoundedAvatar:(UIImageView *)avatarView toDiameter:(float)newSize atView:(UIView *)containedView;
{
    avatarView.layer.cornerRadius = newSize/2;
    avatarView.clipsToBounds = YES;

    avatarView.frame = CGRectMake(0, 0, newSize, newSize);
    CGPoint centerValue = CGPointMake(containView.frame.size.width/2, containedView.frame.size.height/2);
    avatarView.center = centerValue;
}
helloiloveit
źródło
0

Zakreśl z UIBeizerPath # Swift-3 && #imageExtension

class ViewController: UIViewController {
    @IBOutlet weak var imageOutlet: UIImageView!
    override func viewDidLoad() {
        super.viewDidLoad()
        let image = UIImage(named: "IMG_0001.JPG")
        if let image = image {
            let renderimage = image.imageCroppingBezierPath(path: UIBezierPath(arcCenter: CGPoint(x:image.size.width/2,y:image.size.width/2 )  , radius: 200, startAngle: 0, endAngle:  (2 * CGFloat(M_PI) ), clockwise: true) )
                imageOutlet.image = renderimage
        }
    }
}


extension UIImage {
    func imageCroppingBezierPath(path:UIBezierPath) ->UIImage {

        let frame = CGRect(x: 0, y: 0, width: self.size.width, height: self.size.height)

        //Defining a graphic context  to paint on
        UIGraphicsBeginImageContextWithOptions(self.size, false, 0.0)
        //Get the current graphics context (if it exists)
        let context = UIGraphicsGetCurrentContext()
        //save the current graphic context
        context?.saveGState()
        // clipping area
        path.addClip()
        self.draw(in: frame)

        //To extract an image from our canvas
        let image = UIGraphicsGetImageFromCurrentImageContext()
        //restore graphic context
        context?.restoreGState()
        //remove current context from stack
        UIGraphicsEndImageContext()
        return image!
    }
}
Shrawan
źródło
-1
# import QuartzCore framework
imageView.layer.cornerRadius=imgvwUser.frame.size.width/2;
imageView.layer.masksToBounds = YES;

Wysokość i szerokość imageView muszą być takie same, aby uzyskać zaokrąglone rogi.

tania_S
źródło