【问题标题】:Vertical UISlider constraints垂直 UISlider 约束
【发布时间】:2016-12-06 02:51:53
【问题描述】:

我正在创建一个垂直 UISlider。我已经使用所有代码创建了它所在的视图。 (故事板的其余元素使用界面生成器进行约束)

根据我的阅读,要创建一个垂直 UISlider,您需要给 UISlider 一个宽度,然后旋转它。由于 UISlider 所在容器的高度因屏幕尺寸而异,我不想给它一个固定的高度(宽度)。

这就是我的想法

    // Mark: Slider View

    let leftSlider = UISlider()
    let centerSlider = UISlider()
    let rightSlider = UISlider()

    let colorSliders = [leftSlider, centerSlider, rightSlider]

    for slider in colorSliders {

        slider.translatesAutoresizingMaskIntoConstraints = false
        sliderContainer.addSubview(slider)

        let w = sliderContainer.bounds.width
        slider.bounds.size.width = w
        slider.center = CGPoint(x: w/2, y: w/2)
        slider.transform = CGAffineTransform(rotationAngle: CGFloat(-M_PI_2))

        slider.value = 0
        slider.minimumValue = 0
        slider.maximumValue = 255

        let sliderTopConstraint = slider.topAnchor.constraint(equalTo: centerHiddenView.bottomAnchor, constant: 5)
        let sliderBottomConstraint = slider.bottomAnchor.constraint(equalTo: sliderContainer.bottomAnchor, constant: 5)

        NSLayoutConstraint.activate([sliderTopConstraint, sliderBottomConstraint])
        slider.backgroundColor = .purple
        slider.isEnabled = true
        slider.isUserInteractionEnabled = true

    }

    let sliderContainerWidth: CGFloat = sliderContainer.frame.width


    let centerSliderHorizontalConstraints = centerSlider.centerXAnchor.constraint(equalTo: sliderContainer.centerXAnchor)

    let widthConstraint = centerSlider.widthAnchor.constraint(equalToConstant: sliderContainerWidth)

    let centerSliderWidthConstraint = centerSlider.widthAnchor.constraint(equalToConstant: 90)

    NSLayoutConstraint.activate([centerSliderHorizontalConstraints, centerSliderWidthConstraint, widthConstraint])

但是当我运行它时,我得到了这个

这比我今天早些时候的要好得多。但是,我希望滑块是正常宽度..并且看起来正常只是垂直

关于我错过了什么的任何想法? (哦,忽略左边那个紫色的小分支,那是我添加但尚未约束的另外 2 个滑块。)

【问题讨论】:

    标签: swift uislider


    【解决方案1】:

    您正在更改 UISlider 的 bounds 和 transform 并且同时使用自动布局,因此可能会有些混乱。

    我建议你不要修改bounds,而是使用自动布局。您应该将滑块宽度设置为其父视图高度,并将滑块居中于其父视图内。这样,当你旋转它时,它的高度(旋转后)实际上是它的宽度(旋转前)将等于它的超级视图高度。将滑块垂直居中将确保滑块接触其父视图的底部和顶部。

    slider.widthAnchor.constraint(equalTo: sliderContainer.heightAnchor
    slider.centerYAnchor.constraint(equalTo: sliderContainer.centerYAnchor)
    
    slider.centerXAnchor.constraint(equalTo: sliderContainer.centerXAnchor)
    

    如果您想将剩余的 2 个滑块之一放置在其父视图的左侧或右侧,请不要将其水平居中,而是执行以下操作:

    slider.leadingAnchor.constraint(equalTo: sliderContainer.leadingAnchor)
    
    slider.trailingAnchor.constraint(equalTo: sliderContainer.trailingAnchor)
    

    另外,请仔细检查您的控制台是否有自动布局错误日志。

    编辑: 我在一个测试项目中检查了上面的代码,这是我的视图控制器代码:

    class ViewController: UIViewController {
        @IBOutlet private weak var containerView: UIView!
    
    
        override func viewDidAppear(_ animated: Bool) {
            super.viewDidAppear(animated)
    
            let leftSlider = UISlider()
            let centerSlider = UISlider()
            let rightSlider = UISlider()
            let colorSliders = [leftSlider, centerSlider, rightSlider]
    
            var constraints = [NSLayoutConstraint]()
            for slider in colorSliders {
                slider.translatesAutoresizingMaskIntoConstraints = false
                containerView.addSubview(slider)
    
                slider.transform = CGAffineTransform(rotationAngle: CGFloat(-M_PI_2))
    
                constraints.append(slider.widthAnchor.constraint(equalTo: containerView.heightAnchor))
                constraints.append(slider.centerYAnchor.constraint(equalTo: containerView.centerYAnchor))
    
                slider.backgroundColor = .purple
            }
            constraints.append(leftSlider.centerXAnchor.constraint(equalTo: containerView.centerXAnchor))
            constraints.append(centerSlider.centerXAnchor.constraint(equalTo: containerView.leadingAnchor))
            constraints.append(rightSlider.centerXAnchor.constraint(equalTo: containerView.trailingAnchor))
    
            NSLayoutConstraint.activate(constraints)
        }
    }
    

    这就是我得到的:

    【讨论】:

    • 我会检查我的错误日志,但上面建议的代码根本没有改善
    • 我添加了一些我在一个空项目中运行的示例代码,请再次检查我的答案!我认为您添加了太多约束,因为我不必使用您添加额外约束的最后几行代码。
    【解决方案2】:

    (截至 2017 年 7 月 7 日)

    self.customSlider = [[UISlider alloc] init]];
    self.customView = [[UIView alloc] init];
    
    //create the custom auto layout constraints that you wish the UIView to have
    
    [self.view addSubview:self.customView];
    [self.customView addSubview:self.customSlider];
    self.slider.transform = CGAffineTransformMakeRotation(-M_PI_2);
    
    /*Create the custom auto layout constraints for self.customSlider to have these 4 constraints:
        //1. self.customSlider CenterX = CenterX of self.customView
        //2. self.customSlider CenterY = CenterY of self.customView
        //3. self.customSlider width = self.customView height
        //4. self.customSlider height = self.customView width
    */
    

    【讨论】:

      猜你喜欢
      • 2017-04-17
      • 1970-01-01
      • 1970-01-01
      • 2019-07-10
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多