将容器添加到另一个容器 - container.frame.origin 有问题
add container to another container - problem with container.frame.origin
我正在测试平移手势识别器。
我添加了一个白色容器来查看,然后在白色容器中添加了另一个红色容器。
当我打印 whiteContainer.frame.orgin 时,我得到正确的 CGPoint 数字,但是当我打印 redContaner CGPoint 数字时,我得到 0.0, 0.0
class ViewController6 : UIViewController {
let whiteContainer = UIView()
let redContainer = UIView()
var pointOrigin2: CGPoint?
var pointOrigin3: CGPoint?
override func viewDidLoad() {
super.viewDidLoad()
setupView()
}
override func viewDidLayoutSubviews() {
pointOrigin2 = whiteContainer.frame.origin
print(pointOrigin2!)
pointOrigin3 = redContainer.frame.origin
print(pointOrigin3!)
}
private func setupView() {
view.backgroundColor = .black
configureContainer()
configureRedContainer()
addPanGestureRecognizare()
}
func configureContainer() {
view.addSubview(whiteContainer)
whiteContainer.translatesAutoresizingMaskIntoConstraints = false
whiteContainer.backgroundColor = .white
NSLayoutConstraint.activate([
whiteContainer.centerXAnchor.constraint(equalTo: view.centerXAnchor),
whiteContainer.centerYAnchor.constraint(equalTo: view.centerYAnchor),
whiteContainer.widthAnchor.constraint(equalToConstant: 200),
whiteContainer.heightAnchor.constraint(equalToConstant: 200)
])
}
func configureRedContainer() {
whiteContainer.addSubview(redContainer)
redContainer.translatesAutoresizingMaskIntoConstraints = false
redContainer.backgroundColor = .red
NSLayoutConstraint.activate([
redContainer.centerXAnchor.constraint(equalTo: view.centerXAnchor),
redContainer.centerYAnchor.constraint(equalTo: view.centerYAnchor),
redContainer.widthAnchor.constraint(equalToConstant: 50),
redContainer.heightAnchor.constraint(equalToConstant: 50)
])
}
当我添加红色容器进行查看时(不是whiteContainer.addSubview(红色容器))我得到了白色和红色容器的正确 CGPoint 编号。
为什么?
Viewcontroller 如果您在 viewDidLoad
中添加,则子视图不在自己的视图中的帧没有任何计算。如果您将子视图添加到 ViewController 的视图,那么 ViewController 会对该视图进行计算,但如果您将子视图添加到视图的子视图,则不会。这就是为什么您可以看到 whiteContainer
帧不为零且 redContainer
为零的原因。
要做到这一点,你应该说 'view , you should calculation it'。这就是为什么你必须在约束设置后使用 view.layoutIfNeeded()
.
这会解决你的问题
func configureRedContainer() {
whiteContainer.addSubview(redContainer)
redContainer.translatesAutoresizingMaskIntoConstraints = false
redContainer.backgroundColor = .red
NSLayoutConstraint.activate([
redContainer.centerXAnchor.constraint(equalTo: view.centerXAnchor),
redContainer.centerYAnchor.constraint(equalTo: view.centerYAnchor),
redContainer.widthAnchor.constraint(equalToConstant: 50),
redContainer.heightAnchor.constraint(equalToConstant: 50)
])
view.layoutIfNeeded() // must add after setting constraints
}
现在我的 func PanGestute 工作不正常。 “在白色容器外”的条件一直被触发
@OmerTekbiyik ?
func addPanGestureRecognizare() {
let pan = UIPanGestureRecognizer(target: self, action: #selector(handlePanGesture2(sender:)))
redContainer.addGestureRecognizer(pan)
}
@objc func handlePanGesture2(sender : UIPanGestureRecognizer) {
let fileView = sender.view!
switch sender.state {
case .began, .changed:
let translation = sender.translation(in: fileView)
fileView.center = CGPoint(x: fileView.center.x + translation.x, y: fileView.center.y + translation.y)
sender.setTranslation(CGPoint.zero, in: fileView)
case .ended:
if fileView.frame.intersects(whiteContainer.frame) {
print("in white container")
} else {
print("outside the white container")
UIView.animate(withDuration: 0.3, animations: { fileView.frame.origin = self.pointOrigin3!})
}
default:
break
}
}
我正在测试平移手势识别器。 我添加了一个白色容器来查看,然后在白色容器中添加了另一个红色容器。
当我打印 whiteContainer.frame.orgin 时,我得到正确的 CGPoint 数字,但是当我打印 redContaner CGPoint 数字时,我得到 0.0, 0.0
class ViewController6 : UIViewController {
let whiteContainer = UIView()
let redContainer = UIView()
var pointOrigin2: CGPoint?
var pointOrigin3: CGPoint?
override func viewDidLoad() {
super.viewDidLoad()
setupView()
}
override func viewDidLayoutSubviews() {
pointOrigin2 = whiteContainer.frame.origin
print(pointOrigin2!)
pointOrigin3 = redContainer.frame.origin
print(pointOrigin3!)
}
private func setupView() {
view.backgroundColor = .black
configureContainer()
configureRedContainer()
addPanGestureRecognizare()
}
func configureContainer() {
view.addSubview(whiteContainer)
whiteContainer.translatesAutoresizingMaskIntoConstraints = false
whiteContainer.backgroundColor = .white
NSLayoutConstraint.activate([
whiteContainer.centerXAnchor.constraint(equalTo: view.centerXAnchor),
whiteContainer.centerYAnchor.constraint(equalTo: view.centerYAnchor),
whiteContainer.widthAnchor.constraint(equalToConstant: 200),
whiteContainer.heightAnchor.constraint(equalToConstant: 200)
])
}
func configureRedContainer() {
whiteContainer.addSubview(redContainer)
redContainer.translatesAutoresizingMaskIntoConstraints = false
redContainer.backgroundColor = .red
NSLayoutConstraint.activate([
redContainer.centerXAnchor.constraint(equalTo: view.centerXAnchor),
redContainer.centerYAnchor.constraint(equalTo: view.centerYAnchor),
redContainer.widthAnchor.constraint(equalToConstant: 50),
redContainer.heightAnchor.constraint(equalToConstant: 50)
])
}
当我添加红色容器进行查看时(不是whiteContainer.addSubview(红色容器))我得到了白色和红色容器的正确 CGPoint 编号。
为什么?
Viewcontroller 如果您在 viewDidLoad
中添加,则子视图不在自己的视图中的帧没有任何计算。如果您将子视图添加到 ViewController 的视图,那么 ViewController 会对该视图进行计算,但如果您将子视图添加到视图的子视图,则不会。这就是为什么您可以看到 whiteContainer
帧不为零且 redContainer
为零的原因。
要做到这一点,你应该说 'view , you should calculation it'。这就是为什么你必须在约束设置后使用 view.layoutIfNeeded()
.
这会解决你的问题
func configureRedContainer() {
whiteContainer.addSubview(redContainer)
redContainer.translatesAutoresizingMaskIntoConstraints = false
redContainer.backgroundColor = .red
NSLayoutConstraint.activate([
redContainer.centerXAnchor.constraint(equalTo: view.centerXAnchor),
redContainer.centerYAnchor.constraint(equalTo: view.centerYAnchor),
redContainer.widthAnchor.constraint(equalToConstant: 50),
redContainer.heightAnchor.constraint(equalToConstant: 50)
])
view.layoutIfNeeded() // must add after setting constraints
}
现在我的 func PanGestute 工作不正常。 “在白色容器外”的条件一直被触发 @OmerTekbiyik ?
func addPanGestureRecognizare() {
let pan = UIPanGestureRecognizer(target: self, action: #selector(handlePanGesture2(sender:)))
redContainer.addGestureRecognizer(pan)
}
@objc func handlePanGesture2(sender : UIPanGestureRecognizer) {
let fileView = sender.view!
switch sender.state {
case .began, .changed:
let translation = sender.translation(in: fileView)
fileView.center = CGPoint(x: fileView.center.x + translation.x, y: fileView.center.y + translation.y)
sender.setTranslation(CGPoint.zero, in: fileView)
case .ended:
if fileView.frame.intersects(whiteContainer.frame) {
print("in white container")
} else {
print("outside the white container")
UIView.animate(withDuration: 0.3, animations: { fileView.frame.origin = self.pointOrigin3!})
}
default:
break
}
}