从互联网调整图像大小

时间:2015-12-24 09:57:54

标签: uiimageview uiimage firebase swift2 xcode7

我的应用从网址中检索图片,但我需要在 tableview 中的用户界面上显示之前更改图片大小。

这是我的tableViewController代码:

import UIKit
import Firebase
import Alamofire



class FeedViewController: UIViewController, UITableViewDelegate, UITableViewDataSource, UIImagePickerControllerDelegate, UINavigationControllerDelegate, UITextFieldDelegate {

@IBOutlet weak var tableView: UITableView!
@IBOutlet weak var postField: MaterialTextField!
@IBOutlet weak var imageSelectorImage: UIImageView!


var posts = [Post]()
var imageSelected = false
var imagePicker: UIImagePickerController!

static var imageCache = NSCache()

override func viewDidLoad() {
    super.viewDidLoad()

    tableView.delegate = self
    tableView.dataSource = self
    postField.delegate = self

    //tableView.estimatedRowHeight = 400
    //tableView.rowHeight = UITableViewAutomaticDimension



    imagePicker = UIImagePickerController()
    imagePicker.delegate = self


    DataService.ds.REF_POSTS.queryOrderedByChild("timestamp").observeEventType(.Value, withBlock: { snapshot in

        self.posts = []
        if let snapshots = snapshot.children.allObjects as? [FDataSnapshot] {
            for snap in snapshots {
                if let postDict = snap.value as? Dictionary<String, AnyObject> {
                    let key = snap.key
                    let post = Post(postKey: key, dictionary: postDict)
                    self.posts.insert(post, atIndex: 0)
                }
            }

        }

        self.tableView.reloadData()
    })

  }
func textFieldShouldReturn(textField: UITextField) -> Bool {
    textField.resignFirstResponder()
    return true
}


/**
 * Called when the user click on the view (outside the UITextField).
 */
override func touchesBegan(touches: Set<UITouch>, withEvent event: UIEvent?) {
    self.view.endEditing(true)
}

func textFieldDidBeginEditing(textField: UITextField) {
    animateViewMoving(true, moveValue: 167)
}
func textFieldDidEndEditing(textField: UITextField) {
    animateViewMoving(false, moveValue: 167)
}

func animateViewMoving (up:Bool, moveValue :CGFloat){
    let movementDuration:NSTimeInterval = 0.1
    let movement:CGFloat = ( up ? -moveValue : moveValue)
    UIView.beginAnimations( "animateView", context: nil)
    UIView.setAnimationBeginsFromCurrentState(true)
    UIView.setAnimationDuration(movementDuration )
    self.view.frame = CGRectOffset(self.view.frame, 0,  movement)
    UIView.commitAnimations()
}


func numberOfSectionsInTableView(tableView: UITableView) -> Int {
    return 1
}

func tableView(tableView: UITableView, numberOfRowsInSection section: Int) -> Int {
    return posts.count
}

func tableView(tableView: UITableView, cellForRowAtIndexPath indexPath: NSIndexPath) -> UITableViewCell {

    let post = posts[indexPath.row]
    print(post.postDescription)

    if let cell = tableView.dequeueReusableCellWithIdentifier("PostCell") as? PostCell {
        cell.request?.cancel()
        var img: UIImage?
        if let url = post.imageUrl {
            img = FeedViewController.imageCache.objectForKey(url) as? UIImage
        }

        cell.configureCell(post, img: img)
        return cell
    } else {
        return PostCell()
    }
}

func imagePickerController(picker: UIImagePickerController, didFinishPickingImage image: UIImage, editingInfo: [String : AnyObject]?) {
    imagePicker.dismissViewControllerAnimated(true, completion: nil)
    imageSelectorImage.image = image
    imageSelected = true
}

@IBAction func selectImage(sender: UITapGestureRecognizer) {
    presentViewController(imagePicker, animated: true, completion: nil)
}

@IBAction func makePost(sender: AnyObject) {
    //TODO: Add loading spinner while data is being processed
    if let txt = postField.text where txt != "" {
        if let img = imageSelectorImage.image where imageSelected == true {
            let urlStr = URL_IMGSHACK
            let url = NSURL(string: urlStr)!
            //FIXME: Add error handling
            let imgData = UIImageJPEGRepresentation(img, 0.2)!
            let keyData = API_KEY_IMG.dataUsingEncoding(NSUTF8StringEncoding)!
            let keyJSON = "json".dataUsingEncoding(NSUTF8StringEncoding)!

            Alamofire.upload(.POST, url, multipartFormData: { multipartFormData in

                multipartFormData.appendBodyPart(data: imgData, name: "fileupload", fileName: "image",
                    mimeType: "image/jpg")
                multipartFormData.appendBodyPart(data: keyData, name: "key")
                multipartFormData.appendBodyPart(data: keyJSON, name: "format")

                }) { encodingResult in

                    switch encodingResult {
                    case .Success(let upload, _, _):
                        upload.responseJSON(completionHandler: { response in
                            if let info = response.result.value as? Dictionary<String, AnyObject> {
                            if let links = info["links"] as? Dictionary<String, AnyObject>{
                                if let imgLink = links["image_link"] as? String {
                                        print("LINK: \(imgLink)")
                                        self.postToFirebase(imgLink)
                                    }
                                }

                            }
                        })
                    case .Failure(let error):
                        print(error)
                   }
           }

        } else {
            self.postToFirebase(nil)
        }
   }
}

func postToFirebase(imgUrl: String?) {
    var post: Dictionary<String, AnyObject> = [
        "timestamp": NSNumber(longLong: currentTimeMillis()),
        "description": postField.text!,
        "likes": 0
    ]

    if imgUrl != nil {
        post["imageUrl"] = imgUrl!
    }

    let firebasePost = DataService.ds.REF_POSTS.childByAutoId()
    firebasePost.setValue(post)

    postField.text = ""
    imageSelectorImage.image = UIImage(named: "camera")
    imageSelected = false
    tableView.reloadData()
    postField.resignFirstResponder()
}

func currentTimeMillis() ->Int64 {
    let nowDouble = NSDate().timeIntervalSince1970
    return Int64(nowDouble * 1000)
}

}

这是我的自定义单元格:

class PostCell: UITableViewCell {

@IBOutlet weak var profileImage: UIImageView!
@IBOutlet weak var showcaseImage: UIImageView!
@IBOutlet weak var descriptionText: UILabel!
@IBOutlet weak var likesLabel: UILabel!
@IBOutlet weak var likeImage: UIImageView!

var post: Post!
var request: Request?
var likeRef: Firebase!

override func awakeFromNib() {
    super.awakeFromNib()

    let tap = UITapGestureRecognizer(target: self, action: "likeTapped:")
    tap.numberOfTapsRequired = 1
    likeImage.addGestureRecognizer(tap)
    likeImage.userInteractionEnabled = true

}

override func drawRect(rect: CGRect) {
    profileImage.layer.cornerRadius = self.profileImage.frame.size.width / 2
    profileImage.backgroundColor = UIColor.clearColor()
    profileImage.layer.borderWidth = 2
    profileImage.layer.borderColor = UIColor.whiteColor().CGColor
    self.profileImage.clipsToBounds = true
    self.showcaseImage.clipsToBounds = true

}

func configureCell(post: Post, img: UIImage?){
    self.post = post
    likeRef = DataService.ds.REF_USERS_CURRENT.childByAppendingPath("likes").childByAppendingPath(post.postKey)
    self.descriptionText.text = post.postDescription
    self.likesLabel.text = "\(post.likes)"

    if post.imageUrl != nil {

        if img != nil {
            self.showcaseImage.image = img
        } else {

            request = Alamofire.request(.GET, post.imageUrl!).validate(contentType: ["image/*"]).response(completionHandler: { request, response, data, err in

                if err == nil {
                    let img = UIImage(data: data!)!
                    self.showcaseImage.image = img
                    FeedViewController.imageCache.setObject(img, forKey: self.post.imageUrl!)
                } else {
                    print(err.debugDescription)
                }

            })

        }

    } else {
        self.showcaseImage.hidden = true
    }

    likeRef.observeSingleEventOfType(.Value, withBlock: { snapshot in

        if let doesNotExist = snapshot.value as?
            NSNull {
            //This mean we have not liked this specific post
            self.likeImage.image = UIImage(named: "heart-empty")
        } else {
            self.likeImage.image = UIImage(named: "heart-full")
        }

    })
}

func likeTapped(sender: UITapGestureRecognizer) {
    likeRef.observeSingleEventOfType(.Value, withBlock: { snapshot in

        if let doesNotExist = snapshot.value as?
            NSNull {
            self.likeImage.image = UIImage(named: "heart-full")
            self.post.adjustLikes(true)
            self.likeRef.setValue(true)
        } else {
            self.likeImage.image = UIImage(named: "heart-empty")
            self.post.adjustLikes(false)
            self.likeRef.removeValue()
        }
    })
}

}

这是一个展示我想要实现的目标的例子:

this when user post the portrait image

this when user post the landscape image

总之,我希望图像宽度适合设备屏幕的宽度,以及uiimage的动态高度,无论图像方向如何(横向或纵向)。

1 个答案:

答案 0 :(得分:0)

尝试此部件,其中需要300x600尺寸的图像才能保存。

let image = UIImage(data: data!)

UIGraphicsBeginImageContext(CGSizeMake(300, 600))
image?.drawInRect(CGRectMake(0, 0, 300, 600))

let smallImage: UIImage = UIGraphicsGetImageFromCurrentImageContext()
UIGraphicsEndImageContext()