Swift 将具有可变约束的对象与视图上的中心x点对齐
我希望下面的swift代码将框与x轴的中心对齐。您可以从下面的gif中看到我的代码在做什么。当按下紫色按钮时,我希望框对齐。我不知道该怎么做,因为有些约束被声明为var,我不知道下一步该怎么做Swift 将具有可变约束的对象与视图上的中心x点对齐,swift,alignment,constraints,var,uipangesturerecognizer,Swift,Alignment,Constraints,Var,Uipangesturerecognizer,我希望下面的swift代码将框与x轴的中心对齐。您可以从下面的gif中看到我的代码在做什么。当按下紫色按钮时,我希望框对齐。我不知道该怎么做,因为有些约束被声明为var,我不知道下一步该怎么做 我建议直接使用框架而不是约束。 当处理可变屏幕大小和屏幕旋转时,约束是合适的 步骤1:将可移动对象放入容器视图 步骤2:按容器视图内的坐标处理对象 步骤3:将容器添加到视图控制器的视图中,并将其与其他元素一起进行约束布局 class ViewController: UIViewController {
我建议直接使用框架而不是约束。 当处理可变屏幕大小和屏幕旋转时,约束是合适的 步骤1:将可移动对象放入容器视图 步骤2:按容器视图内的坐标处理对象 步骤3:将容器添加到视图控制器的视图中,并将其与其他元素一起进行约束布局
class ViewController: UIViewController {
@IBOutlet weak var container: Container!
override func viewDidLoad() {
super.viewDidLoad()
// Do any additional setup after loading the view.
container.addPanGestures()
}
@IBAction func didTapLeftButton(_ sender: Any) {
container.setLeftAlign()
}
@IBAction func didTapCenterButton(_ sender: Any) {
container.setCenterXAlign()
}
@IBAction func didTapRightButton(_ sender: Any) {
container.setRightAlign()
}
@IBAction func slide(_ sender: UISlider) {
let scale = CGFloat(max(sender.value, 0.1))
container.setWidthScale(scale)
}
}
class Container: UIView {
func setLeftAlign() {
for view in self.subviews {
view.frame.origin = CGPoint(x: 0, y: view.frame.origin.y)
}
}
func setRightAlign() {
for view in self.subviews {
view.frame.origin = CGPoint(x: self.frame.width - view.frame.width, y:view.frame.origin.y)
}
}
func setCenterXAlign() {
for view in self.subviews {
var center = view.center
center.x = self.frame.width / 2
view.center = center
}
}
func setWidthScale(_ ratio: CGFloat) {
for view in self.subviews {
var frame = view.frame
let center = view.center
frame.size.width = self.frame.width * ratio
view.frame = frame
view.center = center
}
}
func addPanGestures() {
for v in self.subviews {
let panGesture = UIPanGestureRecognizer(target: self, action: #selector(didPan(_:)))
v.addGestureRecognizer(panGesture)
}
}
private var initCenter: CGPoint!
@objc func didPan(_ sender: UIPanGestureRecognizer) {
let view = sender.view!
let translation = sender.translation(in: view)
switch sender.state {
case .began:
initCenter = view.center
case .changed:
view.center = CGPoint(x: initCenter.x + translation.x, y: initCenter.y + translation.y)
case .cancelled:
view.center = initCenter
default:
return
}
}
}
你能分享你的Xcode项目吗?我试着复制代码,但我遗漏了一些东西,无法通过平移手势移动对象。我只是使用带有一些元素的情节提要。没有什么特别的,请确保在添加平移手势之前加载视图。
class ViewController: UIViewController {
@IBOutlet weak var container: Container!
override func viewDidLoad() {
super.viewDidLoad()
// Do any additional setup after loading the view.
container.addPanGestures()
}
@IBAction func didTapLeftButton(_ sender: Any) {
container.setLeftAlign()
}
@IBAction func didTapCenterButton(_ sender: Any) {
container.setCenterXAlign()
}
@IBAction func didTapRightButton(_ sender: Any) {
container.setRightAlign()
}
@IBAction func slide(_ sender: UISlider) {
let scale = CGFloat(max(sender.value, 0.1))
container.setWidthScale(scale)
}
}
class Container: UIView {
func setLeftAlign() {
for view in self.subviews {
view.frame.origin = CGPoint(x: 0, y: view.frame.origin.y)
}
}
func setRightAlign() {
for view in self.subviews {
view.frame.origin = CGPoint(x: self.frame.width - view.frame.width, y:view.frame.origin.y)
}
}
func setCenterXAlign() {
for view in self.subviews {
var center = view.center
center.x = self.frame.width / 2
view.center = center
}
}
func setWidthScale(_ ratio: CGFloat) {
for view in self.subviews {
var frame = view.frame
let center = view.center
frame.size.width = self.frame.width * ratio
view.frame = frame
view.center = center
}
}
func addPanGestures() {
for v in self.subviews {
let panGesture = UIPanGestureRecognizer(target: self, action: #selector(didPan(_:)))
v.addGestureRecognizer(panGesture)
}
}
private var initCenter: CGPoint!
@objc func didPan(_ sender: UIPanGestureRecognizer) {
let view = sender.view!
let translation = sender.translation(in: view)
switch sender.state {
case .began:
initCenter = view.center
case .changed:
view.center = CGPoint(x: initCenter.x + translation.x, y: initCenter.y + translation.y)
case .cancelled:
view.center = initCenter
default:
return
}
}
}