重新加载视图控制器并以编程方式更改UIImageView约束

时间:2016-01-17 02:31:17

标签: ios swift uiimageview aspect-ratio

我有一个UIImageView,其高度受用户从其库中选取或选择的照片的宽高比影响。在用户选择照片后,我无法正确地(或根本不)调整UIImageView的大小。

代码:

func imagePickerController(picker: UIImagePickerController, didFinishPickingMediaWithInfo info: [String : AnyObject]) {
        //let mediaType2 : UIImage = info[UIImagePickerControllerOriginalImage] as! UIImage
        let mediaType : CFString = info[UIImagePickerControllerMediaType] as! CFString

        if mediaType == kUTTypeMovie {
            let path = (info[UIImagePickerControllerMediaURL] as! NSURL).path
            if UIVideoAtPathIsCompatibleWithSavedPhotosAlbum(path!) {
                UISaveVideoAtPathToSavedPhotosAlbum(path!, self, "video:didFinishSavingWithError:contextInfo:", nil)
            }
        }
        else{
            let img : UIImage = info[UIImagePickerControllerOriginalImage] as! UIImage
            let screenSize: CGRect = UIScreen.mainScreen().bounds
            let multiplyNum = screenSize.width / img.size.width
            imageView.frame = CGRectMake(0, 0, screenSize.width, multiplyNum*img.size.height)
            imageView.image = img

        }

        self.dismissViewControllerAnimated(true, completion: {})

    }

目前在故事板中设置了约束,但我想以编程方式覆盖imageView的约束。

2 个答案:

答案 0 :(得分:1)

您应该更新UIImageView的约束而不是设置框架。为图像视图设置高度约束,然后为该约束创建一个IBOutlet(控制从约束拖动到它的视图控制器中),称之为" imageViewHeightConstraint。"然后在你的代码中说出如下内容:

imageViewHeightConstraint.constant = multiplyNum*img.size.height

答案 1 :(得分:0)

@ beyowulf的答案将起作用并且很容易实现

但是如果您不想设置约束出口,可以在代码中指定ratio属性,而且女巫也很简单:

//remove the last image ration constraint
if let ratioConstrain = self.ratioConstrain {
    self.imageView.removeConstraint(ratioConstraint)
}

self.ratioConstraint = NSLayoutConstraint(
    item: self.imageView, attribute: NSLayoutAttribute.Width,
    relatedBy: NSLayoutRelation.Equal,
    toItem: self.imageView, 
    attribute: NSLayoutAttribute.Height,
    multiplier: image!.size.width / image!.size.height, 
    constant: 0)

self.imageView.addConstraint(self.ratioConstraint!)

请勿使用不起作用的框架 在这种情况下,您需要删除imageView的高度约束,并将宽度设置为超级视图,您将得到您想要的:屏幕宽度相等,高度随图像本身的比例而变化。 / p>

有一个问题,如果您从滚动得到的图像太小,您可能希望宽度小于屏幕,在这种情况下,您应该将imageView宽度约束设置为lessThanOrEqual(< =),并且添加一些位置约束(如中心垂直,中心水平),看起来会更好。