2015-12-24 2 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; let image = NSImage (imageLiteral: «Enterprise.png»), а затем назначить изображение imageView; myImageView.image = изображение. Он будет автоматически изменен, чтобы соответствовать размеру NSImageView; ширина будет заполняться горизонтально, а вертикаль будет переменной. – Jay

+0

@Jay hai Jay, им жаль, потому что мой английский очень плохой, но это моя проблема, я успешно извлекаю изображение из Интернета и отображаю его в своей таблице viewview и сохраняю в кеше, если эти данные являются uiimage, но моя проблема в том, что данные изображения являются строкой, проблема в том, что я хочу, чтобы это изображение было преобразовано в фактическое изображение сначала перед отображением в моей таблице, но я не собираюсь это делать. Потому что мне нужно сначала изменить размер – user5714084

+0

Итак, вопрос заключается в том, как преобразовать изображение, сохраненное в виде строки в firebase, в UIImage, а затем изменить его размер? – 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

Смежные вопросы