我有这些不同的视图,如图所示:主视图是container
,内部是boxSentence
,在boxSentence
内部,是subView
,在subView
内部,带有灰色框boxWord
的不同文本标签。然后是另一个视图boxAnswer
,它是我创建的可拖动元素,只能拖放到boxWord
内部(我将boxWord
传递给了boxAnswer
的自定义类,以检查其位置(帧) )。
在这种情况下,一切正常,只能放置boxAnswer
在盒子里Word
然后用于调整整个视图的图形,我想将我的subView
及其所有实际子视图放在boxSentence
的中心。为此,我使用了subView.center = boxSentence.center
,并获得了想要的东西。
[现在,问题出在我尝试将boxAnswer
拖放到boxWord
的新位置内时,它不起作用,但是如果我尝试将其拖放到boxWord
的位置之前,它工作的中心。
似乎当您执行subView.center = boxSentence.center
时,它仅影响subView
的框架,但不影响其子视图的框架。有关如何解决问题的任何建议?
CODE:
// 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)
CLASS 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
}
}
}
let redView = UIView()
redView.backgroundColor = .red
redView.frame = CGRect(x: 20, y: 20, width: 100, height: 100)
self.view.addSubview(redView)
let greenView = UIView()
greenView.backgroundColor = .green
greenView.frame = CGRect(x: 25, y:25, width:50, height: 50)
redView.addSubview(greenView)
print(redView.frame)
/*
(20.0, 20.0, 100.0, 100.0)
redView is placed self.view.bounds.origin.x + 20 and self.view.bounds.origin.y + 20
*/
print(greenView.frame)
/*
(25.0, 25.0, 50.0, 50.0)
green is placed redView.bounds.origin.x + 25 and redView.bounds.origin.y + 25
*/
print(redView.convert(greenView.frame, to: self.view))
/*
(45.0, 45.0, 50.0, 50.0)
converted frame of greenView from redViews bounds to of self.view bounds.
*/
所以在DragObject内部的问题是,传递框架和视图坐标,以反映它们相对于subView视图原点的位置。同时,DragObject是容器视图的子视图,当您收到触摸坐标时,您将获得相对于容器视图的坐标。您可以通过将vista.frame转换为DragObject Superview坐标系来解决此问题。这是DragObject中的重写func touchesEnded(_ touches:Set,带有事件:UIEvent?)的完整代码。
var coorv = vista.superview!.convert(vista.frame, to: self.superview!) 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 = coorv } else { print("fuori") self.frame = initcoord }