Как установить UIImageView с закругленными углами для режима соответствия аспект
Обычно я использую следующий код для установки закругленных углов.
imageView.layer.cornerRadius = 10
Он работает, если для параметра imageView установлено значение "Аспект заполнения".
Но когда для параметра imageView установлен режим Aspect Fit, а соотношение между изображением и изображением отличается.
Эффект закругленных углов не сможет сказать.
![введите описание изображения здесь]()
Цвет фона установлен на зеленый, чтобы показывать закругленные углы.
Есть ли способ установить "реальную часть изображения" в закругленные углы.
Заранее благодарю за ваши ответы.
Ответы
Ответ 1
Используйте это расширение для UIImageView:
extension UIImageView
{
func roundCornersForAspectFit(radius: CGFloat)
{
if let image = self.image {
//calculate drawingRect
let boundsScale = self.bounds.size.width / self.bounds.size.height
let imageScale = image.size.width / image.size.height
var drawingRect: CGRect = self.bounds
if boundsScale > imageScale {
drawingRect.size.width = drawingRect.size.height * imageScale
drawingRect.origin.x = (self.bounds.size.width - drawingRect.size.width) / 2
} else {
drawingRect.size.height = drawingRect.size.width / imageScale
drawingRect.origin.y = (self.bounds.size.height - drawingRect.size.height) / 2
}
let path = UIBezierPath(roundedRect: drawingRect, cornerRadius: radius)
let mask = CAShapeLayer()
mask.path = path.cgPath
self.layer.mask = mask
}
}
}
![Без вызова этой функции]()
![После вызова этого метода расширения]()
Ответ 2
Swift 3 версия полезного, принятого ответа здесь!
extension UIImageView {
func roundCornersForAspectFit(radius: CGFloat)
{
if let image = self.image {
//calculate drawingRect
let boundsScale = self.bounds.size.width / self.bounds.size.height
let imageScale = image.size.width / image.size.height
var drawingRect : CGRect = self.bounds
if boundsScale > imageScale {
drawingRect.size.width = drawingRect.size.height * imageScale
drawingRect.origin.x = (self.bounds.size.width - drawingRect.size.width) / 2
}else {
drawingRect.size.height = drawingRect.size.width / imageScale
drawingRect.origin.y = (self.bounds.size.height - drawingRect.size.height) / 2
}
let path = UIBezierPath(roundedRect: drawingRect, cornerRadius: radius)
let mask = CAShapeLayer()
mask.path = path.cgPath
self.layer.mask = mask
}
}
}
Ответ 3
Попробуйте, это может вам помочь:
import UIKit
class ViewController: UIViewController{
@IBOutlet weak var myImageView: UIImageView!
override func viewDidLoad() {
super.viewDidLoad()
// Do any additional setup after loading the view, typically from a nib.
myImageView.contentMode = UIViewContentMode.ScaleAspectFit
myImageView.clipsToBounds = true
//myImageView.layer.cornerRadius = 10.0
myImageView.layer.masksToBounds = true
let simpleImage = UIImage(named:"ipad5_einladung.jpg")
let corneredImage = generateRoundCornerImage(simpleImage!, radius: 10)
//Set cornered Image
myImageView.image = corneredImage;
}
override func didReceiveMemoryWarning() {
super.didReceiveMemoryWarning()
// Dispose of any resources that can be recreated.
}
func generateRoundCornerImage(image : UIImage , radius : CGFloat) -> UIImage {
let imageLayer = CALayer()
imageLayer.frame = CGRectMake(0, 0, image.size.width, image.size.height)
imageLayer.contents = image.CGImage
imageLayer.masksToBounds = true
imageLayer.cornerRadius = radius
UIGraphicsBeginImageContext(image.size)
imageLayer.renderInContext(UIGraphicsGetCurrentContext())
let roundedImage = UIGraphicsGetImageFromCurrentImageContext()
UIGraphicsEndImageContext()
return roundedImage
}
}
Ответ 4
Сначала вам нужно установить ширину и высоту того же значения. Затем установите свойства изображения следующим образом:
imgProfile_Pic.layer.cornerRadius = cell.imgProfile_Pic.frame.size.height / 2
imgProfile_Pic.layer.borderWidth = 3.0
imgProfile_Pic.layer.borderColor = UIColor.white.cgColor
imgProfile_Pic.clipsToBounds = true
imgProfile_Pic.layoutIfNeeded()
Ответ 5
Это принятый ответ, преобразованный в Objective-C:
if (self.image) {
double boundsScale = self.bounds.size.width / self.bounds.size.height;
double imageScale = self.image.size.width / self.image.size.height;
CGRect drawingRect = self.bounds;
if (boundsScale > imageScale) {
drawingRect.size.width = drawingRect.size.height * imageScale;
drawingRect.origin.x = (self.bounds.size.width - drawingRect.size.width) / 2;
}
else {
drawingRect.size.height = drawingRect.size.width / imageScale;
drawingRect.origin.y = (self.bounds.size.height - drawingRect.size.height) / 2;
}
UIBezierPath *path = [UIBezierPath bezierPathWithRoundedRect:drawingRect cornerRadius:cornerRadius];
CAShapeLayer *mask = [CAShapeLayer new];
[mask setPath:path.CGPath];
[self.layer setMask:mask];
}
Просто поместите это в категорию для UIImageView.
Ответ 6
Swift 5
Принятый ответ, созданный Аруном Амманной, неверен. Мы должны сместить результирующий прямоугольник, используя этот путь, используя радиус:
import UIKit
extension UIImageView {
func roundCornersForAspectFit(radius: CGFloat) {
guard let image = image else {
return
}
let boundsScale = bounds.size.width / bounds.size.height
let imageScale = image.size.width / image.size.height
var drawingRect = bounds
let boundHeight = bounds.size.height
let boundWidth = bounds.size.width
if boundsScale > imageScale {
let scaledImageWidth = image.size.width * boundHeight / image.size.height
drawingRect.size.width = scaledImageWidth - radius * 2.0
drawingRect.origin.x = boundWidth / 2 - scaledImageWidth / 2 + radius
drawingRect.size.height = boundHeight - radius * 2.0
drawingRect.origin.y = radius
} else {
let scaledImageHeight = image.size.height * boundWidth / image.size.width
drawingRect.size.height = scaledImageHeight - radius * 2.0
drawingRect.origin.y = boundHeight / 2 - scaledImageHeight / 2 + radius
drawingRect.size.width = boundWidth - radius * 2.0
drawingRect.origin.x = radius
}
let path = UIBezierPath(roundedRect: drawingRect, cornerRadius: radius)
let mask = CAShapeLayer()
mask.path = path.cgPath
layer.mask = mask
}
}
Ответ 7
Это очень просто, чтобы округлить изображение таким образом:
self.profileImageView?.clipsToBounds = true
self.profileImageView!.layer.cornerRadius = 10
self.profileImageView?.layer.borderWidth = 1.0
self.profileImageView?.contentMode = .ScaleAspectFit
Но для того, чтобы изображение было округлено с соотношением изображений, я думаю, вам нужно установить режим просмотра изображения в режиме ScaleAspectFill.