2017-02-13 4 views
0

В моей функции viewDidLoad У меня есть цикл, создающий таблицу квадратных изображений (блоков) 3x6. Идея состоит в том, чтобы в конечном итоге переместить и сопоставить их.Ссылка на изображение коснулось

Вопрос в том, как назначить текущее изображение, которое было затронуто или перетащено, как переменная? Вот как я добавляю изображение:

let squareImg = UIImageView(image:#imageLiteral(resourceName: "square")) 
view.addSubview(squareImg) 

И вот что я пытаюсь сделать:

@IBAction func handlePan(_ recognizer: UIPanGestureRecognizer) { 
    let translation = recognizer.translation(in: self.view) 
     if recognizer.state == UIGestureRecognizerState.began { 
     isDragging = true 

     let objectDragging = self.view //this is wrong and what I'm trying to correct 

     print("bg color of block being moved \(objectDragging?.backgroundColor)") 

.... 

ответ

0

Хранить изображения в виде массива, назначить их индекс к значению тега, винт touchesBagan и т.д., и просто использовать жест распознаватели.

Добавление изображений становится:

var myImages = [UIImage]() 

let squareImg = UIImageView(image:#imageLiteral(resourceName: "square"), tag: [//add a distinguished tag here]) 
view.addSubview(squareImg) 
myImages.append(squareImg) 

Теперь, когда ваши взгляды в массиве (они не должны быть UIImageViews или даже UIImages, просто что-то уникальное), просто указывают на правильную вещь в вашем массиве :

@IBAction func handlePan(_ recognizer: UIPanGestureRecognizer) { 
    let translation = recognizer.translation(in: self.view) 
     for view in self.subviews as [UIView] { 
      if let imageView = view as? UIImageView { 
       let image = myImages.tag 
     } 
    } 
} 

Я знаю, что это не то, о чем вы просите. Но техника есть. Я настрою свой ответ на основе ваших отзывов.

EDIT:.

На основе комментариев, это звучит как хорошая стратегия продвижения вперед является по крайней мере заполнить свойство тега с «связанными парами в каком-то цикле Кроме того, это звучит как какое-то ошибки сборки. Вот мой вопрос по этому вопросу ....

Свойства тега доступны для каждого объекта, будь то вид или элемент управления. Кроме того, они имеют тип Int. В последнем комментарии указаны ссылки ошибок неправильный аргумент в вызове функции, ожидающий изображение. Я думаю, что происходит две разные вещи.

(1) Заполнение свойства тега для «связанных» изображений в цикле.

Если вы загружаете «квадрат» и «круг» n раз, создавайте объекты в цикле с индексом и заполняете их свойство тега.

for index in 0...10 { 

    // instantiate your images 

    // associate these images by populating their tag values 
    imgSquare.tag = index 
    imgCircle.tag = index 

    // continue any other set here 

} 

Типы циклов в Swift являются изначально Int, поэтому это верно.

(2) Неправильная ошибка построения ссылки.

Ошибка сборки на линии

let circleImg = UIImageView(image: circle, tag: [arrayCounter]) 

Это не «консервы» инициализатор UIImageView, и от ошибок сборки это (пока) не кодированное расширение UIImageView. Похоже, что - это кодированное расширение для UIImageView, которое ожидает два аргумента, image и highlightImage. Если вы хотите продлить UIImageView что-то вроде этого, я бы создать расширение с удобством инициализатором:

extension UIImageView { 
    convenience init(image: UIImage, tag:Int) { 
     self.init() 
     self.image = image 
     self.tag = tag 
    } 
} 

Это скелет. Вы можете добавить инструкцию охраны и сделать ее инициализатором с возможностью запуска. Вы можете добавить фреймы, backgroundColor, что угодно. Дело в том, что у вас в настоящее время нет есть инициализатор, вызывающий 'image: tag:', но вы кодируете его.

+0

Вот как я должен был начать, спасибо. Теперь для тега, с которым я не знаком, как мне это сделать? Поскольку каждый раз, когда я создаю новый и другой цветной квадрат, мне нужно, чтобы каждый тег был другим? Как какая-то счетная переменная? Или это не то, что я собираюсь с этой настройкой. – idlehand

+0

Мне трудно ответить. В чем цель? Это какая-то игра, где растут трудности или трудности? Или что-то перестраивает «квадраты»? Даже между теми, которые вы можете найти, «помечая» все «лучшее», чего я не вижу. Массив «3x6» может быть проще всего сделать как одномерный массив из 18 вместо двухмерного массива 3x6. Лично? Я бы пошел с сохранением UIColors вместо UIImages, а тем более UIImageViews. Теги, которые должны быть целыми числами, были бы такими, как 0 == colors1, 1 == color1 и т. Д. Но детали будут диктовать вещи. – dfd

+0

Я не на 100% понят, что вы делаете (это звучит как-то довольно круто), но из того, что я собираю, если вы хотите «связать» различные взгляды друг с другом, которые могут быть лучшим кандидатом на то, как заполнять их свойство тега. Например, если у вас есть шесть цветов среди квадратов и кругов, и объект должен переместить каждый цветный квадрат в соответствующий круг, каждая «пара» или «ассоциация» будет значением тега. Возможно, вам даже не понадобится массив. – dfd

0

просто попробовать этот

let objectDragging = recognizer.view 
+0

Это позволило мне построить, но напечатать нуль в качестве значения. – idlehand

0

Вы можете использовать переопределение предоставляемые от UIImageView.

Для примера,

class DragImag: UIImageView { 
    var draggedView: UIView? 

    override init(frame: CGRect) { 
     super.init(frame: frame) 
    } 

    required init?(coder aDecoder: NSCoder) { 
     super.init(coder: aDecoder) 
    } 

    override func touchesBegan(touches: Set<UITouch>, withEvent event: UIEvent?) { 

    } 

    override func touchesMoved(touches: Set<UITouch>, withEvent event: UIEvent?){ 
//here you get your desired view 
     draggedView = touches.view 
    } 

    override func touchesEnded(touches: Set<UITouch>, withEvent event: UIEvent?){ 


    } 
} 
+0

Спасибо за предложение. Я обманывал себя прикосновением и двигался, но я не уверен, что я бы это сделал правильно. Что вы имеете в виду при добавлении DragImg в качестве подкласса к изображениям? Где это будет сделано? – idlehand

+0

Больше похоже на присвоение значения типа DragImg. Например, 'let squareImg: DragImg = UIImageView (изображение: #imageLiteral (resourceName:" square "))' –

+0

Спасибо за объяснение. И я мог бы поставить этот класс перед классом контроллера view, а затем добавить DragImg в качестве подкласса к моим изображениям, как вы предложили? – idlehand

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