Search code examples
iosswiftcgpointnsvalue

Get CGPoint value from NSValue in array


Trying to extract CGPoint values from my allCenters array, which contains NSValues. They were converted to NSValues from CGPoints initially. I know that this code is what I'm trying to do, but I guess it doesn't work in SWIFT 2: CGPoint randLoc = [[allCenters objectsAtIndex: randLocInt] CGPointValue]. I'm needing help on the last line of code, before the override funcs.

import UIKit
import Foundation
var tiledViewsStack = [AnyObject]()

class PhotoViewController: UIViewController, UIImagePickerControllerDelegate, UINavigationControllerDelegate {

    //Choose an image from Photo Library and display on screen in displayImageView

    @IBOutlet weak var displayImageView: UIImageView!

    @IBAction func choosePicFromLibrary(sender: AnyObject) {
        let imagePicker: UIImagePickerController = UIImagePickerController()

        imagePicker.sourceType = UIImagePickerControllerSourceType.PhotoLibrary
        imagePicker.delegate = self
        imagePicker.modalPresentationStyle = UIModalPresentationStyle.Popover

        if (imagePicker.popoverPresentationController != nil) {
            imagePicker.popoverPresentationController!.sourceView = sender as! UIButton
            imagePicker.popoverPresentationController!.sourceRect = (sender as! UIButton).bounds
        }
        presentViewController(imagePicker, animated: true, completion: nil)
    }

    @IBAction func takePhoto(sender: AnyObject) {
        let imagePicker: UIImagePickerController = UIImagePickerController()

        imagePicker.sourceType = UIImagePickerControllerSourceType.Camera
        imagePicker.delegate = self
        imagePicker.modalPresentationStyle = UIModalPresentationStyle.Popover

        if (imagePicker.popoverPresentationController != nil) {
            imagePicker.popoverPresentationController!.sourceView = sender as! UIButton
            imagePicker.popoverPresentationController!.sourceRect = (sender as! UIButton).bounds
        }
        presentViewController(imagePicker, animated: true, completion: nil)
    }


    func imagePickerController(picker: UIImagePickerController, didFinishPickingMediaWithInfo info: [String : AnyObject]) {
        dismissViewControllerAnimated(true, completion: nil)
        displayImageView.image = info[UIImagePickerControllerOriginalImage] as! UIImage!
    }

    func imagePickerControllerDidCancel(picker: UIImagePickerController) {
        dismissViewControllerAnimated(true, completion: nil)
    }



    //Cut photo into 9 tiles
    //Cut selected image into 9 pieces and add each cropped image to tileImageStack array

    var tileImageStack = [AnyObject]()

    @IBAction func randomize(sender: AnyObject) {

        let selectedImageWidth = displayImageView.image!.size.width
        let selectedImageHeight = displayImageView.image!.size.height

        let tileSize = CGSizeMake(selectedImageWidth/3, selectedImageHeight/3)

        for (var colI = 0; colI < 3; colI++)
        {
            for (var rowI = 0; rowI < 3; rowI += 1)
            {
                let tileRect = CGRectMake(CGFloat(rowI) * tileSize.width, tileSize.height * CGFloat(colI), tileSize.width, tileSize.height)

                if let selectedImage = displayImageView.image
                {
                    let tileImage = CGImageCreateWithImageInRect(selectedImage.CGImage, tileRect)
                    let aUItile = UIImage(CGImage: tileImage!)
                    tileImageStack.append(aUItile)
                }
            }
        }

        //Display tiles in order on screen, then mix them up randomly

        let frameWidth = self.view.frame.width
        let frameHeight = self.view.frame.height

        var xCen = (frameWidth/3)/2
        var yCen = (frameHeight/3)/2

        var pieceNumber = 0
        var allCenters = [NSValue]()

        for (var v = 0; v < 3; v += 1)
        {
            for (var h = 0; h < 3; h += 1)
            {
                let tiledView = UIImageView(frame:CGRectMake(0, 0, frameWidth/3, (frameHeight)/3))
                var curCenter = CGPointMake(xCen, yCen)
                allCenters.append(NSValue(CGPoint:curCenter))
                //tiledView.backgroundColor = UIColor.redColor()
                tiledView.center = curCenter
                tiledView.image = tileImageStack[pieceNumber] as? UIImage
                tiledView.userInteractionEnabled = true
                tiledViewsStack.append(tiledView)
                self.view.addSubview(tiledView)
                xCen += (frameWidth/3)
                pieceNumber += 1
            }
            xCen = (frameWidth/3)/2
            yCen += (frameHeight/3)
        }

        tiledViewsStack[0].removeFromSuperview()
        tiledViewsStack.removeAtIndex(0)
        //Now there are 8 imageViews in the tiledViewsStack array, and 9 centers stored in allCenters array.
    }

    var randLocInt = Int((arc4random()*10) % 9) // 0, --- 8

    //CGPoint randLoc = [[allCenters objectsAtIndex: randLocInt] CGPointValue]
    var randLoc = CGPointFromValue(allCenters[randLocInt])



    override func viewDidLoad() {
        super.viewDidLoad()

        // Do any additional setup after loading the view.
    }

    override func didReceiveMemoryWarning() {
        super.didReceiveMemoryWarning()
        // Dispose of any resources that can be recreated.
    }        
}

enter image description here


Solution

  • If allCenters contains always NSValue objects why do you declare it as the quite unspecified [AnyObject]?

    Help the compiler and the compiler will help you

    var allCenters = [NSValue]()
    
    ...
    
    let randLoc = allCenters[randLocInt].CGPointValue()
    

    and declare allCenters inside the class