【问题标题】:Change Height of UIProgressView in Swift在 Swift 中更改 UIProgressView 的高度
【发布时间】:2015-09-24 10:26:12
【问题描述】:

我一直在尝试更改进度视图的大小和旋转以适应屏幕大小。它基本上可以在手机屏幕上产生填充玻璃效果。

我通过使用相当无害地旋转了它 self.masteryProgress.transform = CGAffineTransformMakeRotation((CGFloat(-90) / CGFloat(180.0) * CGFloat(M_PI)))

我使用view.bounds 获得了包围屏幕的视图大小,试图获取矩形和宽度x 高度。所以我没有被困在那里。

我尝试使用 .frame .drawRect,但是当我使用它们时,它要么破坏它们,要么什么都不做。

在 interfaceBuilder 中,height 属性似乎被锁定为恒定值 2。

在我构建自定义动画之前有什么解决方案吗?

我尝试像其他帖子所说的那样在 interfaceBuilder 中设置进度条的高度,但是无论在什么设备上运行,我都需要让进度视图填满整个屏幕,这样解决方案在我的情况下不起作用。

我最终使用 CGAffineTransformScale(masteryProgress.transform, view.bounds.height / 1334, (view.bounds.width / 2))

由于我正在垂直旋转 progressView,我将进度视图设置为宽度 1334(iPhone 6 Plus 的高度)和高度 2。通过将屏幕高度除以这些值,它应该调整大小完美连接任何手机。

【问题讨论】:

  • 请检查上一个问题。自动布局方式也可以应用在storyboard中。
  • @WonjugKim 这很好,但我需要它来调整屏幕大小,界面生成器只能让你静态调整大小。

标签: swift uiprogressview


【解决方案1】:

你可以像这样设置它的变换来缩放它:

斯威夫特 2

masteryProgress.transform = CGAffineTransformScale(masteryProgress.transform, 1, 20)

Swift 3、4

masteryProgress.transform = masteryProgress.transform.scaledBy(x: 1, y: 20)

【讨论】:

  • 我之前使用的是 CGAffineTransformMakeScale。谢谢!
  • 您好,我正在尝试将此代码用于我的酒吧,但不幸的是我的对角线填充...有什么想法吗?
  • 如果您能看看@Bannings stackoverflow.com/questions/31453454/…,将不胜感激
  • 这样做你会失去圆角半径并使其模糊
【解决方案2】:

这将起作用:

masteryProgress.transform = CGAffineTransformMakeScale(1, 4)

【讨论】:

    【解决方案3】:

    转换似乎仍然是实现这一目标的唯一方法。 尝试将其作为 UIProgressView 的扩展添加

    extension UIProgressView {
    
        @IBInspectable var barHeight : CGFloat {
            get {
                return transform.d * 2.0
            }
            set {
                // 2.0 Refers to the default height of 2
                let heightScale = newValue / 2.0
                let c = center
                transform = CGAffineTransformMakeScale(1.0, heightScale)
                center = c
            }
        }   
    }
    

    【讨论】:

      【解决方案4】:

      Swift - UIProgressView fills diagonally 我也遇到了同样的情况

      使用

      缩放进度条后
      CGAffineTransformMakeScale(1.0, 5.0)
      

      条形动画从左上角填充到右下角。

      【讨论】:

        【解决方案5】:

        如果您使用 Interface Builder 添加了 UIProgressView,只需创建高度约束并更改为您需要的值。就是这样。

        【讨论】:

        • 哇哦,对了。我正在与变形和消失的角落作斗争,但实际上这很简单;)只是遗憾的是故事板没有反映现实。
        【解决方案6】:

        在 Swift 3 中,它改为 CGAffineTransform(scaleX: CGFloat, y: CGFloat)。所以代码是:

        masteryProgress.transform = CGAffineTransform(scaleX: 1, y: 4)
        

        【讨论】:

        • 嗨! ...当我将 CGAffineTransform 用于 progressview 并将 iphone 转为横向模式时,progressview-bar 会重置比例.. 为什么?!
        【解决方案7】:

        在 Swift 3.0.2 版本中使用这个:

        masteryProgress.transform = masteryProgress.transform.scaledBy(x: 1, y: 5)
        

        【讨论】:

          【解决方案8】:

          我在将UIProgressView 设为圆形矩形时遇到了问题。仅使用变换

          masteryProgress.transform = CGAffineTransformMakeScale(1, 4)
          

          我达到了这不是我的最终要求

          虽然我最终的期望是这样的

          我终于通过以下两个步骤实现了它

          1.从界面生成器设置高度约束:

          2。创建 UIProgressView 的自定义类并覆盖 func layoutSubviews() 以添加自定义遮罩层:

              override func layoutSubviews() {
                  super.layoutSubviews()
          
                  let maskLayerPath = UIBezierPath(roundedRect: bounds, cornerRadius: 4.0)
                  let maskLayer = CAShapeLayer()
                  maskLayer.frame = self.bounds
                  maskLayer.path = maskLayerPath.cgPath
                  layer.mask = maskLayer
              }
          

          这是最终结果

          【讨论】:

          • 谢谢!很好的实现
          【解决方案9】:

          UIProgressView 放入UIStackView 并设置UIStackView 的约束也可能有效。至少对我有用

          【讨论】:

            【解决方案10】:

            对“Sauvik Dolui”答案的一些修改:

            在 UIBezierPath 中你应该设置cornerRadius: like (self.frame.height / 2)。 这是比使用 (4.0) 更通用的解决方案。

            override func layoutSubviews() {
                super.layoutSubviews()
            
                let maskLayerPath = UIBezierPath(roundedRect: bounds, cornerRadius: self.frame.height / 2)
                let maskLayer = CAShapeLayer()
                maskLayer.frame = self.bounds
                maskLayer.path = maskLayerPath.cgPath
                layer.mask = maskLayer
            }
            

            【讨论】:

              【解决方案11】:

              我尝试了 Swift 5 的公认答案,将标签固定在 progressView 的底部,并且标签被奇怪地拉伸了。为了在没有任何其他问题的情况下更改高度,我使用 heightAnchor 将其设置为我想要的高度。

              1- 创建一个程序化的UIProgressView

              lazy var progressView: UIProgressView = {
                  let progressView = UIProgressView(progressViewStyle: .default)
                  progressView.translatesAutoresizingMaskIntoConstraints = false
                  progressView.trackTintColor = .white
                  progressView.progressTintColor = .green
                  progressView.progress = 0
                  return progressView
              }()
              

              2- 设置heightAnchor 约束:

              progressView.heightAnchor.constraint(equalToConstant: 12).isActive = true 
              
              progressView.centerYAnchor.constraint(equalTo: view.centerYAnchor).isActive = true
              progressView.leadingAnchor.constraint(equalTo: view.safeAreaLayoutGuide.leadingAnchor, constant: 20).isActive = true
              progressView.trailingAnchor.constraint(equalTo: view.safeAreaLayoutGuide.trailingAnchor, constant: -20).isActive = true
              

              【讨论】:

                【解决方案12】:

                它对我有用:

                progress.transform = progress.transform.scaledBy(x: 1, y: self.bounds.size.height)

                self.bounds.size.height”是你想要的高度

                【讨论】:

                  【解决方案13】:

                  我给了它高度限制,它对我有用。我给了它 10 常数。但是,如果您要创建一个通用应用程序,您也可以使用乘数。

                  【讨论】:

                    猜你喜欢
                    • 2017-05-03
                    • 1970-01-01
                    • 2015-12-03
                    • 2019-01-14
                    • 1970-01-01
                    • 1970-01-01
                    • 1970-01-01
                    • 1970-01-01
                    • 1970-01-01
                    相关资源
                    最近更新 更多