Добавление нового фрейма на основе изображения внутри приложения ImageView for PhotoEditing
Я работаю над приложением "Редактирование фотографий", мне нужно добавить кадр на изображение, в основном я использовал другой UIImageView с тем же фреймом моего оригинального UIImageView и просто добавил png-изображение. Теперь проблема в том, что мне нужен кадр, основанный на высоте и ширине рамки внутри изображения. ![введите описание изображения здесь]()
как в приведенном выше изображении, мой кадр появляется в целом UIImageView, но мое изображение внутри Imageview является ландшафтом, поэтому, если мое изображение внутри Imageview является ландшафтом, тогда мне нужен альбомный кадр, и если изображение является "Портрет", мне нужен портретный кадр. Как мне это достичь?
У меня есть 2 вида изображения с одинаковой шириной высоты, один из них является исходным представлением изображения, а другой - обрамлением кадра. Теперь у меня есть изображение, используя следующий код
вывод изображения из StoryBoard
@IBOutlet var imgFrame: UIImageView!
Применение рамки к ImageView
imgFrame.isHidden = false
imgFrame.image = #imageLiteral(resourceName: "Frame-Style-1.png")
Ответы
Ответ 1
Думаю, вам нужно две вещи.
Сохраняйте размер рамки UIImageView так же, как и исходный UIImageView.
Чтобы настроить это, вы должны выровнять привязки верхнего, нижнего, верхнего и конечного изображений рамочного изображения к соответствующим якорям исходного изображения.
Отрегулируйте размер источника UIImageView до размера изображения.
Самое простое, что вы можете сделать для настройки размера UIImageView
на размер UIImage
, - это ограничение соотношения сторон. Что еще, я настроил режим содержимого как UIImageView
как , чтобы заполнить.
let image = UIImage(named: "portrait")!
let aspectRatio = image.size.height / image.size.width
let aspectRatioConstraint = NSLayoutConstraint(item: userImageView,attribute: .height,relatedBy: .equal,toItem: userImageView,attribute: .width,multiplier: aspectRatio,constant: 0)
userImageView.image = image
userImageView.addConstraint(aspectRatioConstraint)
frameImageView.image = UIImage(named: "landscape-frame")
Вы также должны поместить источник UIImageView
внутри контроллера вида, но я оставляю его вам.
Это результат, который я получил с помощью этого кода.
![landscape result image]()
Это ссылка в пример проекта на GitHub
Ответ 2
сделать innerImageview
отображаемое изображение как .scaleAspectFit
без пробела:
func set(image: UIImage, to imageView: UIImageView) {
// 1. find sizeScale
let sizeScaleX = imgFrame.frame.width / image.size.width
let sizeScaleY = imgFrame.frame.height / image.size.height
let sizeScale = sizeScaleX > sizeScaleY ? sizeScaleX : sizeScaleY
// 2. change imageView frame
imageView.frame.size = CGSize(width: image.size.width*sizeScale, height: image.size.height*sizeScale)
// 3. center imageView
imageView.frame.origin.x = (imgFrame.frame.width-imageView.frame.width)/2
imageView.frame.origin.y = (imgFrame.frame.height-imageView.frame.height)/2
}
// image is the image what you got (from library/camera or anywhere)
// 1. set image to imgFrame which contain space
imgFrame.image = image
// 2. generate a new image without space
var innerImageView = UIImageView()
set(image: image, to: innerImageView)
// 3. add frame on image
imgFrame.addSubview(innerImageView)
Ответ 3
Предполагая, что это значение вашего mainImageView
и изображения (Пейзаж):
mainImageView.frame.size
▿ (500.0, 500.0)
- width : 500.0
- height : 500.0
mainImageView.image?.size
▿ Optional<CGSize>
▿ some : (1440.0, 800.0)
- width : 1440.0
- height : 800.0
Вы знаете, что ширина 500, высота может быть рассчитана так:
frame.width / image.width * image.height