Swift新手求助:如何将AKSlider设为垂直方向及布局教程推荐
垂直AKSlider显示问题解决 + 代码布局UI教程推荐
一、解决垂直滑块显示不全的问题
你遇到的旋转后滑块显示一半的问题,核心是旋转后视图的frame和bounds没有匹配正确,加上直接用draw(CGRect)设置大小的方式不太适配Auto Layout(你后面用了StackView和约束)。这里给你调整后的代码思路:
关键调整点:
- 不要用
draw(CGRect)来初始化滑块大小,改用设置bounds或者通过Auto Layout约束来控制尺寸 - 旋转滑块后,宽高会互换,所以要提前把滑块的bounds设置为「旋转后的期望尺寸」(比如你要垂直滑块显示60高度,那旋转前的bounds应该是宽20、高60,旋转后就变成宽60、高20的垂直滑块)
- 把旋转后的滑块放进一个容器View里,再加入StackView,避免StackView的布局逻辑干扰旋转后的视图位置
调整后的代码片段:
fileprivate lazy var stack: UIStackView = { // 处理Y方向垂直滑块 let ySlider = AKSlider(property: "Y VELOCITY", value: yVelocityBallArray[ballBloqDoubleTapped], range: 0 ... 100, taper: 4, format: "%1f Hz" ) { sliderValue in yVelocityBallArray[ballBloqDoubleTapped] = sliderValue ballBloqArray[ballBloqDoubleTapped].physicsBody?.velocity = CGVector(dx: 0, dy: (sliderValue * 10)) } // 设置旋转前的bounds:宽20(旋转后变成高度),高60(旋转后变成宽度) ySlider.bounds = CGRect(x: 0, y: 0, width: 20, height: 60) // 旋转滑块,锚点默认是中心,旋转后位置不会偏移 ySlider.transform = CGAffineTransform(rotationAngle: -CGFloat.pi / 2) // 把垂直滑块放进容器View,方便StackView布局 let ySliderContainer = UIView() ySliderContainer.translatesAutoresizingMaskIntoConstraints = false ySliderContainer.addSubview(ySlider) // 约束滑块在容器中心,容器尺寸匹配旋转后的滑块大小 NSLayoutConstraint.activate([ ySlider.centerXAnchor.constraint(equalTo: ySliderContainer.centerXAnchor), ySlider.centerYAnchor.constraint(equalTo: ySliderContainer.centerYAnchor), ySliderContainer.widthAnchor.constraint(equalToConstant: 60), ySliderContainer.heightAnchor.constraint(equalToConstant: 20) ]) // X方向水平滑块保持原来的逻辑,去掉draw方法,用约束或bounds let xSlider = AKSlider(property: "X VELOCITY", value: xVelocityBallArray[ballBloqDoubleTapped], range: 0 ... 100, taper: 4, format: "%0.3f Hz" ) { sliderValue in xVelocityBallArray[ballBloqDoubleTapped] = sliderValue ballBloqArray[ballBloqDoubleTapped].physicsBody?.velocity = CGVector(dx: (sliderValue * 10), dy: 0) } xSlider.bounds = CGRect(x: 0, y: 0, width: 60, height: 20) // 重新组织StackView,把Y滑块容器加进去 let stack = UIStackView(arrangedSubviews: [ySliderContainer, xSlider, ballIDLabel, MIDIChannelSlider] ) stack.translatesAutoresizingMaskIntoConstraints = false stack.axis = .vertical stack.distribution = .fillEqually stack.spacing = 8 // 可以加一点间距,布局更美观 return stack }()
为什么这样调整?
draw(CGRect)是UIKit中用于自定义绘制的方法,不是用来设置视图大小的正确方式,用bounds或Auto Layout约束更适配StackView的布局逻辑- 旋转视图后,系统会自动调整frame,但bounds是视图自身的坐标系,提前设置好bounds能保证旋转后的显示尺寸符合预期
- 容器View的作用是隔离旋转视图的布局影响,让StackView能正确计算子视图的尺寸,避免旋转导致的布局错乱
二、推荐适合新手的代码布局UI教程
作为Swift新手,推荐从「基础Auto Layout」和「UIStackView深入使用」入手,再根据需求选择SwiftUI或UIKit方向:
UIKit方向(你当前用的是这个)
- 苹果官方Auto Layout指南:系统讲解Auto Layout的核心概念(约束、优先级、布局系统),是最权威的入门资料
- UIStackView专题教程:重点学习
axis、distribution、alignment、spacing这几个属性的用法,以及嵌套StackView的技巧——StackView是UIKit中快速布局的利器,能帮你减少大量约束代码 - 原生约束链式调用:学习用
NSLayoutConstraint.activate()创建约束,理解「锚点(Anchor)」的概念,先掌握原生逻辑更利于基础打牢
SwiftUI方向(更适合新手的现代布局方式)
- 苹果官方SwiftUI入门教程:从基础的视图布局开始,一步步教你用声明式语法构建UI,无需手动写约束,布局逻辑更直观
- SwiftUI Stack布局专题:HStack、VStack、ZStack是SwiftUI的核心布局容器,和UIKit的StackView类似,但用法更简洁,适合快速上手
额外提示
如果是SpriteKit项目中嵌入UIKit视图,记得要处理好SKView和UIView的层级关系,确保UIKit的视图容器(比如你的弹出视图)的约束正确绑定到SKView上,避免布局偏移。
内容的提问来源于stack exchange,提问作者mrmac
相关产品推荐
相关产品推荐

