2015-12-24 74 views
0

我的应用程序从URL中检索图像,但在我的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的高度是动态的。

+0

这个问题有点不清楚。给定一个大小的图像,当你把它分配给一个NSImage;让image = NSImage(imageLiteral:“Enterprise.png”),然后将图像分配给imageView; myImageView.image = image。它会自动重新调整大小以适应NSImageView的大小;宽度将水平填充并且垂直可变。 – Jay

+0

@Jay hai Jay,对不起,因为我的英语非常糟糕,但这是我的问题,我成功地从互联网上检索图像并显示在我的tableviewcell中,并存储在缓存中,如果该数据是uiimage,但我的问题是,图像数据是字符串,问题是我希望该图像转换为实际图像之前显示在我的tableviewcell,但我不知道这样做。因为我需要先调整它的大小 – user5714084

+0

因此,问题是如何将图像转换为图像,并将其作为字符串存储在Firebase中,然后调整大小? – Jay

回答

0

试试这个零件,其中需要300x600大小的图片才能保存。

let image = UIImage(data: data!) 

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

let smallImage: UIImage = UIGraphicsGetImageFromCurrentImageContext() 
UIGraphicsEndImageContext() 
+0

我会尽快尝试,谢谢队友:) – user5714084