2016-01-25 1 views
6

, поэтому я хочу показать некоторые фотографии в виде аннотаций на карте. Для этого мне нужно добавить свойство изображения MKAnnotationView. Я использую обычные изображения, но я хочу, чтобы они были округлены и с рамкой. Поэтому я нашел способ обойти UIImage, и я нашел способ добавить границу к UIImage, но граница, похоже, не добавляется (у меня на самом деле нет изображения на экране, может быть, это проблема?).Округление UIImage и добавление границы

Я использовал этот ответ https://stackoverflow.com/a/29047372/4665643 с небольшой модификацией для границы. А именно:

imageView.layer.borderWidth = 1.5 
imageView.layer.borderColor = UIColor.whiteColor().CGColor 
imageView.clipsToBounds = true 

Но мое изображение на карте не имеет границы. Какие-либо предложения ?

+0

должно быть' 'не .maskToBounds' clipToBounds'? – Tj3n

+0

Эй, так что на самом деле исходный ответ тоже имел это, но он все еще не работает. –

+0

hmm ... тогда я думаю, что есть внешний вид, который деформирует это изображение с его размером?, Внешний вид должен быть больше или что-то, чтобы фактически показать границу. Я пробовал ваш код, и он отлично работает, добавлена ​​граница – Tj3n

ответ

5
imageView.layer.masksToBounds=true 
imageView.layer.borderWidth=1.5 
imageView.layer.borderColor = UIColor.whiteColor().CGColor 
imageView.layer.cornerRadius=imageView.bounds.width/2 

Попробуйте это.

+1

в Swift 4.0 является imageView.layer.borderColor = UIColor.white.cgColor – Maziyar

+0

@Maziyar, в Swift 4.0, это: imageView.layer.borderColor = .white.cgColor –

0

Просто исправлено. Видимо, все было отлично, но я не видел границы. Исходное изображение составляет около 300x300 пикселей и с границей в 1,5 пикселя. Я обрезал его, чтобы он соответствовал рамке 40x40, поэтому граница была едва заметной. Изменение ширины границы на большее число сделало ее видимой.

+0

Если тест с iphone 6 plus в симуляторе, я замечаю много небольших линий (например, разделителя tableview) также исчезнуть – Tj3n

1

Supportive image added

Я поставил masksToBounds, и он работает.

layer.masksToBounds = true 
2

Используйте это расширение UIImageView:

func cropAsCircleWithBorder(borderColor : UIColor, strokeWidth: CGFloat) 
{ 
    var radius = min(self.bounds.width, self.bounds.height) 
    var drawingRect : CGRect = self.bounds 
    drawingRect.size.width = radius 
    drawingRect.origin.x = (self.bounds.size.width - radius)/2 
    drawingRect.size.height = radius 
    drawingRect.origin.y = (self.bounds.size.height - radius)/2 

    radius /= 2 

    var path = UIBezierPath(roundedRect: CGRectInset(drawingRect, strokeWidth/2, strokeWidth/2), cornerRadius: radius) 
    let border = CAShapeLayer() 
    border.fillColor = UIColor.clearColor().CGColor 
    border.path = path.CGPath 
    border.strokeColor = borderColor.CGColor 
    border.lineWidth = strokeWidth 
    self.layer.addSublayer(border) 

    path = UIBezierPath(roundedRect: drawingRect, cornerRadius: radius) 
    let mask = CAShapeLayer() 
    mask.path = path.CGPath 
    self.layer.mask = mask 
} 

Использование:

 self.circleView.cropAsCircleWithBorder(UIColor.redColor(), strokeWidth: 20) 

Результат:

Result

1

просто одна строка кода его работы для т е

self.profileImage.layer.cornerRadius = self.profileImage.frame.size.width/2 
2

Для создания образа закругленный с границей, вы можете сделать это с User Defined выполнения Атрибуты также, нет необходимости писать код для этого.

Пожалуйста, проверьте ниже изображение для настройки, что

enter image description here

Также в вашем коде, измените

imageView.layer.clipsToBounds = true 

к этому,

imageView.layer.masksToBounds = true 
+0

Это не сработало для меня, и UIImageView не имеет свойства masksToBounds. – Nestor

+0

@Nestor, вы можете использовать 'imageView.layer.masksToBounds = true' – Rajat

4

Если вы хотите добавить граница с вашим изображением, вам нужно убедиться, что вы добавили дополнительную комнату к этому в противном случае ваша граница будет помещена в верхнюю часть вашего изображения. Решение состоит в том, чтобы дважды увеличить ширину вашего штриха до ширины и высоты изображения и изменить contentMode на .Center.

extension UIImage { 
    func roundedWithBorder(width: CGFloat, color: UIColor) -> UIImage? { 
     let square = CGSize(width: min(size.width, size.height) + width * 2, height: min(size.width, size.height) + width * 2) 
     let imageView = UIImageView(frame: CGRect(origin: .zero, size: square)) 
     imageView.contentMode = .center 
     imageView.image = self 
     imageView.layer.cornerRadius = square.width/2 
     imageView.layer.masksToBounds = true 
     imageView.layer.borderWidth = width 
     imageView.layer.borderColor = color.cgColor 
     UIGraphicsBeginImageContextWithOptions(imageView.bounds.size, false, scale) 
     defer { UIGraphicsEndImageContext() } 
     guard let context = UIGraphicsGetCurrentContext() else { return nil } 
     imageView.layer.render(in: context) 
     return UIGraphicsGetImageFromCurrentImageContext() 
    } 
} 

площадка Тестирование:

let profilePicture = UIImage(data: try! Data(contentsOf: URL(string:"http://i.stack.imgur.com/Xs4RX.jpg")!))! 

profilePicture.roundedWithBorder(width: 100, color: .red) 
1

решение Leo Dabus «s в Swift 3:

extension UIImage { 
    func roundedImageWithBorder(width: CGFloat, color: UIColor) -> UIImage? { 
     let square = CGSize(width: min(size.width, size.height) + width * 2, height: min(size.width, size.height) + width * 2) 
     let imageView = UIImageView(frame: CGRect(origin: CGPoint(x: 0, y: 0), size: square)) 
     imageView.contentMode = .center 
     imageView.image = self 
     imageView.layer.cornerRadius = square.width/2 
     imageView.layer.masksToBounds = true 
     imageView.layer.borderWidth = width 
     imageView.layer.borderColor = color.cgColor 
     UIGraphicsBeginImageContextWithOptions(imageView.bounds.size, false, scale) 
     guard let context = UIGraphicsGetCurrentContext() else { return nil } 
     imageView.layer.render(in: context) 
     let result = UIGraphicsGetImageFromCurrentImageContext() 
     UIGraphicsEndImageContext() 
     return result 
    } 
}