То, что у меня есть, это различные виды, как показано на рисунке: основной вид - container
, внутри которого - boxSentence
, внутри boxSentence
- subView
, а внутри subView
различные текстовые метки с серой рамкой boxWord
. Затем есть еще одно представление boxAnswer
, которое представляет собой перетаскиваемый элемент, который я создал и который можно отбросить только внутри boxWord
(я передаю boxWord
в свой пользовательский класс boxAnswer
, чтобы проверить его положение (фрейм)).
В этом сценарии все работает нормально, boxAnswer
можно поместить только внутри поля ввода
Затем для настройки графики всего вида я хочу поместить мой subView
со всеми его фактическими подпредставлениями в центр boxSentence
. Для этого я использовал subView.center = boxSentence.center
и получил то, что хотел.
Теперь проблема возникает, когда я пытаюсь перетащить boxAnswer
в новую позицию boxWord
, это не работает, но если я попытаюсь перетащить его туда, где было boxWord
, прежде чем переместить его в центр, это сработает.
Кажется, что когда вы делаете subView.center = boxSentence.center
, это влияет только на кадр subView
, но это не влияет на кадрыего подпредставления. Любые предложения о том, как решить проблему?
КОД:
// creo box dove inserire la frase
let boxSentence = UIView(frame: CGRect(x: 0, y: 0, width: container.frame.width, height: container.frame.height/2))
container.addSubview(boxSentence)
boxSentence.backgroundColor = hexStringToUIColor(hex: "#49eb34")
let subView = UIView(frame: CGRect(x: 0, y: 0, width: container.frame.width, height: 70))
let label1 = UILabel(frame: CGRect(x: 0, y: 0, width: 100, height: 100))
label1.text = esercizio.ctsex![0].first_sentence
label1.backgroundColor = UIColor.yellow
label1.sizeToFit()
let boxWord = UIView(frame: CGRect(x: label1.frame.maxX, y: 0, width: 100, height: 60))
boxWord.backgroundColor = UIColor.gray
let label2 = UILabel(frame: CGRect(x: boxWord.frame.maxX, y: 0, width: 100, height: 100))
label2.text = esercizio.ctsex![0].second_sentence
label2.backgroundColor = UIColor.yellow
label2.sizeToFit()
subView.addSubview(label1)
subView.addSubview(boxWord)
subView.addSubview(label2)
subView.backgroundColor = UIColor.purple
boxSentence.addSubview(sottoView)
subView.frame = CGRect(x: 0, y: 0, width: label2.frame.maxX-label1.frame.minX, height: 80)
subView.center = boxSentence.center
let coordrisposta = CGRect(x: boxFrase.frame.minX, y: boxFrase.frame.maxY, width: 80.0, height: 40.0)
let boxAnswer = DragObject(frame: coordrisposta, vistap: boxWord)
boxAnswer.backgroundColor = UIColor.red
container.addSubview(rispostaBox)
КЛАСС DragObject OF boxAnser:
import UIKit
// CLASSE CHE CREA UNA VISTA CHE PUO ESSERE SPOSTATA SOLO ALL'INTERNO DI UNA VISTA PASSATA DA PARAMETRO
class DragObject: UIView {
var vista: UIView
var initcoord: CGRect
init(frame: CGRect, vistap: UIView){
self.vista = vistap
self.initcoord = frame
super.init(frame: frame)
}
required init?(coder: NSCoder) {
fatalError("init(coder:) has not been implemented")
}
override func touchesBegan(_ touches: Set<UITouch>, with event: UIEvent?) {
print("touch began")
}
override func touchesMoved(_ touches: Set<UITouch>, with event: UIEvent?) {
var touch : UITouch! = touches.first as UITouch?
self.center = touch.location(in: self.superview)
}
override func touchesEnded(_ touches: Set<UITouch>, with event: UIEvent?) {
var coorv = vista.frame
print(coorv)
let coord1 = (touches.first?.location(in: self.superview))!
let destinazione1 = CGPoint(x: coorv.minX, y: coorv.minY)
let destinazione2 = CGPoint(x: coorv.maxX, y: coorv.maxY)
if coord1.x > destinazione1.x && coord1.y > destinazione1.y && coord1.x < destinazione2.x && coord1.y < destinazione2.y {
print("OK")
self.frame = vista.frame
} else {
print("fuori")
self.frame = initcoord
}
}
}