从数组中的 NSValue 获取 CGPoint 值
Get CGPoint value from NSValue in array
正在尝试从我的 allCenters
数组中提取 CGPoint 值,其中包含 NSValues
。它们最初从 CGPoints 转换为 NSValues。我知道这段代码是我想要做的,但我猜它在 SWIFT 2: CGPoint randLoc = [[allCenters objectsAtIndex: randLocInt] CGPointValue]
中不起作用。
在覆盖函数之前,我需要最后一行代码的帮助。
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.
}
}
如果 allCenters
总是包含 NSValue
个对象,您为什么将其声明为完全未指定的 [AnyObject]
?
帮助编译器,编译器也会帮助你
var allCenters = [NSValue]()
...
let randLoc = allCenters[randLocInt].CGPointValue()
并在 class
中声明 allCenters
正在尝试从我的 allCenters
数组中提取 CGPoint 值,其中包含 NSValues
。它们最初从 CGPoints 转换为 NSValues。我知道这段代码是我想要做的,但我猜它在 SWIFT 2: CGPoint randLoc = [[allCenters objectsAtIndex: randLocInt] CGPointValue]
中不起作用。
在覆盖函数之前,我需要最后一行代码的帮助。
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.
}
}
如果 allCenters
总是包含 NSValue
个对象,您为什么将其声明为完全未指定的 [AnyObject]
?
帮助编译器,编译器也会帮助你
var allCenters = [NSValue]()
...
let randLoc = allCenters[randLocInt].CGPointValue()
并在 class
中声明allCenters