Я хотел бы заново нарисовать линию между двумя подвижными UIView, в зависимости от положения UIView.
Итак, я нашел это . Однако этот метод использует «Жест панорамирования» для перерисовки линий в зависимости от положения жеста.
Также найдены setNeedsDisplay (), но это запрос на перерисовку, а не функция события в реальном времени.
Я хочу найти его не для того, чтобы использовать жесты для перерисовки линий, а для перерисовки линий в реальном времени.
Чуть более подробно я применил UIColisionBehavior ко всем созданным мною UIV-видам. UIView применяет изменения позиции по мере их удара, и в зависимости от измененной позиции линия перерисовывается.
Как будто UIView двигался таким образом, соединенная линия была перерисована в соответствии с тем, куда она была перемещена:
Ниже приведен код, с которым я экспериментирую на детской площадке. Когда вы выполните код, вы увидите, что первая подключенная фиолетовая линия связана с падающим UIView и не падает:
//: A UIKit based Playground for presenting user interface
import UIKit
import PlaygroundSupport
class MoveAbleView : UIView {
var outGoingLine : CAShapeLayer?
var inComingLine : CAShapeLayer?
override init(frame: CGRect) {
super.init(frame: frame)
}
required init?(coder aDecoder: NSCoder) {
fatalError("init(coder:) has not been implemented")
}
func lineTo(connectedView: MoveAbleView) -> CAShapeLayer {
let path = UIBezierPath()
path.move(to: self.center)
path.addLine(to: connectedView.center)
let line = CAShapeLayer()
line.path = path.cgPath
line.lineWidth = 5
line.strokeColor = UIColor.purple.cgColor
connectedView.inComingLine = line
outGoingLine = line
return line
}
}
class MyViewController : UIViewController {
var dynamicAnimator = UIDynamicAnimator()
var collisionBehavior = UICollisionBehavior()
var gravityBehavior = UIGravityBehavior()
override func loadView() {
let view = UIView()
view.backgroundColor = .white
self.view = view
let viw = MoveAbleView(frame: CGRect(x: 100, y: 200, width: 50, height: 50))
viw.backgroundColor = UIColor.red
self.view.addSubview(viw)
let viw2 = MoveAbleView(frame: CGRect(x: 300, y: 100, width: 50, height: 50))
viw2.backgroundColor = UIColor.orange
self.view.addSubview(viw2)
let gravityViw = MoveAbleView(frame: CGRect(x: 100, y: 0, width: 50, height: 50))
gravityViw.backgroundColor = UIColor.green
self.view.addSubview(gravityViw)
let gravityViw2 = MoveAbleView(frame: CGRect(x: 300, y: -200, width: 50, height: 50))
gravityViw2.backgroundColor = UIColor.blue
self.view.addSubview(gravityViw2)
collisionBehavior.addItem(viw)
collisionBehavior.addItem(viw2)
collisionBehavior.addItem(gravityViw)
collisionBehavior.addItem(gravityViw2)
gravityBehavior.addItem(gravityViw)
gravityBehavior.addItem(gravityViw2)
dynamicAnimator.addBehavior(collisionBehavior)
dynamicAnimator.addBehavior(gravityBehavior)
self.view.layer.addSublayer(viw.lineTo(connectedView: viw2))
}
}
// Present the view controller in the Live View window
PlaygroundPage.current.liveView = MyViewController()
Когда UIView наносит удар и перемещается, как вы перерисовываете подключенную линию в реальном времени?