Ios 为照片编辑应用程序添加基于ImageView内部图像的新帧

Ios 为照片编辑应用程序添加基于ImageView内部图像的新帧,ios,swift3,frame,Ios,Swift3,Frame,我正在开发照片编辑应用程序,我需要在图像上添加帧,基本上我使用了另一个UIImageView,它与我原来的UIImageView具有相同的帧,只需添加png图像。现在的问题是,我需要一个基于图像视图内帧的高度和宽度的帧 如上图所示,我的框架出现在整个UIImageView中,但我在Imageview中的图像是横向的,所以如果我在Imageview中的图像是横向的,那么我需要横向框架,如果图像是纵向的,那么我需要纵向框架。我如何做到这一点 我使用了两个相同高度和宽度的图像视图,一个是原始图像视图,

我正在开发照片编辑应用程序,我需要在图像上添加帧,基本上我使用了另一个UIImageView,它与我原来的UIImageView具有相同的帧,只需添加png图像。现在的问题是,我需要一个基于图像视图内帧的高度和宽度的帧

如上图所示,我的框架出现在整个UIImageView中,但我在Imageview中的图像是横向的,所以如果我在Imageview中的图像是横向的,那么我需要横向框架,如果图像是纵向的,那么我需要纵向框架。我如何做到这一点

我使用了两个相同高度和宽度的图像视图,一个是原始图像视图,另一个是帧图像视图,现在我使用下面的代码应用图像

从故事板中输出图像

@IBOutlet var imgFrame: UIImageView!
将框架应用于ImageView

                imgFrame.isHidden = false
                imgFrame.image = #imageLiteral(resourceName: "Frame-Style-1.png")

假设这些是
mainImageView
和图像(横向)的值:

mainImageView.frame.size
▿ (500.0, 500.0)
-宽度:500.0
-高度:500.0
mainImageView.image?尺寸
▿ 可选的
▿ 部分:(1440.0800.0)
-宽度:1440.0
-身高:800.0
你知道宽度是500,高度可以这样计算:
frame.width/image.width*image.height

我想你需要两样东西

保持框架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")
您还必须将source
UIImageView
放置在视图控制器中,但这由您决定。 这是我使用此代码实现的示例结果


这是GitHub上的示例项目的第一步,使
innerImageview
一样显示图像。ScaleSpectFit
没有空格:

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's 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)

你的密码在哪里?顺便说一句,请提供相关代码,可能对您有帮助。@iPatel检查我的更新版本question@iPatel你明白我的问题了吗?我想你没有理解我的问题。我不确定我是否理解问题所在。您想保持这两个图像视图的帧相同,还是想对横向和纵向使用不同的帧图像?@KamilSzostakowski我想对横向和纵向使用不同的帧图像。@KhushbuDesai根据您的解释,您有一个带有景观图像的方形图像视图。您希望创建另一个框架以适合景观图像(而不是方形图像视图)以创建“框架效果”。这就是你要问的吗?是的,如果图像视图中的图像是横向的,那么我想添加另一个相同横向尺寸的图像视图,以便在图像视图上添加帧层。我想在图片上添加框架,所以如果图片是横向的,那么框架必须是横向的,如果图片是纵向的,那么框架必须是纵向的,我已经尝试了你的代码,但它对我不起作用。它只是使图像Aspectfit。您对横向和纵向框架都使用单一资源,还是有单独的资源?我对两者都使用单一资源。我认为您必须根据源图像方向旋转它,并将其分配给框架图像视图。我将很快更新我的答案。我更新了我的答案。我在示例中添加了一个实际帧,在代码部分,我展示了如何将帧图像指定给帧图像视图。这就是你想要的吗?你真的得到了我想要的吗?我想同时使用框架和图像。两者都是UIImageView。是的,我的示例使
imgFrame
根据您的需要显示图像,然后sizeI更新我的答案,让答案更接近您的情况
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's 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)