You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Swift新手求助:如何将AKSlider设为垂直方向及布局教程推荐

垂直AKSlider显示问题解决 + 代码布局UI教程推荐

一、解决垂直滑块显示不全的问题

你遇到的旋转后滑块显示一半的问题,核心是旋转后视图的frame和bounds没有匹配正确,加上直接用draw(CGRect)设置大小的方式不太适配Auto Layout(你后面用了StackView和约束)。这里给你调整后的代码思路:

关键调整点:

  1. 不要用draw(CGRect)来初始化滑块大小,改用设置bounds或者通过Auto Layout约束来控制尺寸
  2. 旋转滑块后,宽高会互换,所以要提前把滑块的bounds设置为「旋转后的期望尺寸」(比如你要垂直滑块显示60高度,那旋转前的bounds应该是宽20、高60,旋转后就变成宽60、高20的垂直滑块)
  3. 把旋转后的滑块放进一个容器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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.06 10:37:32