如何禁用垂直滚动 UIScrollView?

Posted

技术标签:

【中文标题】如何禁用垂直滚动 UIScrollView?【英文标题】:How to disable vertical scrolling UIScrollView? 【发布时间】:2016-11-04 02:07:28 【问题描述】:

问题

http://im2.ezgif.com/tmp/ezgif-2269702568.gif

我已将contentSize 设置为我想要的高度。但是,我的滚动视图仍然具有垂直滚动。实际上有很多空白区域,我不知道为什么。

我不确定是不是因为我这样做了:contentOffset = CGPoint(x:0, y: self.frame.minY)。但我这样做的原因是当我将按钮放在滚动视图中时,我必须向下滚动才能看到它们。 contentOffset 允许按钮在加载时位于滚动视图上。

如果有人可以在仍然显示按钮的同时禁用垂直滚动,那就太好了!

代码

在我的视图控制器中,我设置了自定义滚动视图:

class ScheduleViewController: UIViewController 
    private var scheduleBar: ScheduleBar!
    private let barHeight: CGFloat = 55
    override func viewDidLoad() 
        super.viewDidLoad()
        scheduleBar = ScheduleBar(frame: CGRect(x: 0, y: (self.navigationController?.navigationBar.frame.maxY)!, width: self.view.bounds.width, height: barHeight))
        scheduleBar.setUp(buttonsData: times, selected: 2)
        self.view.addSubview(scheduleBar)
   

在自定义滚动视图中,我进一步设置了滚动视图:

class ScheduleBar: UIScrollView 
    private var buttons: [UIButton]!
    private var bar: UIView!
    private var buttonWidth: CGFloat!
    private var buttonPadding: CGFloat = 20

func setUp(buttonsData: [String], selected: Int)
        self.backgroundColor = UIColor.white

        buttons = []
        for time in buttonsData
            let button = UIButton(frame: CGRect(x: 0, y: 0, width: 50, height: self.bounds.height))
            button.setTitle(time, for: UIControlState.normal)
            button.setTitleColor(Color.black, for: UIControlState.normal)
            button.titleLabel?.font = UIFont(name: "HelveticaNeue-Medium", size: 13.0)
            button.sizeToFit()
            buttonWidth = button.bounds.width + buttonPadding
            buttons.append(button)
        
        for i in 0...(buttons.count-1)
            if i == 0 
                buttons[i].frame = buttons[i].frame.offsetBy(dx:buttonPadding/2, dy: 0)
            else if i == buttons.count-1
               buttons[i].frame = buttons[i].frame.offsetBy(dx: CGFloat(i) * buttonWidth + buttonPadding/2, dy: 0)
            
            else
              buttons[i].frame = buttons[i].frame.offsetBy(dx: CGFloat(i) * buttonWidth + buttonPadding, dy: 0)
            
            buttons[i].center.y = (self.bounds.height/2)
            addSubview(buttons[i])
        

        bar = UIView(frame: CGRect(x: 0, y: self.bounds.height - 3.0, width: buttons[0].bounds.width + buttonPadding, height: 3.0))
        bar.backgroundColor = Color.red
        select(index: selected, animation: false)
        addSubview(bar)

        self.contentSize = CGSize(width: CGFloat(buttons.count) * buttonWidth + buttonPadding, height: self.bounds.height)
        //reset origin of scrollview
        self.contentOffset = CGPoint(x:0, y: self.frame.minY)
    

    func select(index: Int, animation: Bool)
        func select() -> Void
            if index == 0
                bar.frame.origin.x = CGFloat(0)
            else
                bar.frame.origin.x = buttons[index].frame.minX - buttonPadding/2
            
        
        if animation 
            UIView.animate(withDuration: 0.7, animations: select())
        else
            select()
        
        scrollRectToVisible(CGRect(x: buttons[index].frame.minX, y: self.frame.minY, width: buttons[index].bounds.width, height: buttons[index].bounds.height), animated: true)
    

【问题讨论】:

对于滚动视图,您面临的问题集bouncevertically = false @Vinodh 刚刚尝试过。没用。事实上,我的 UIScrollView 并没有从按钮的位置开始,所以我不得不滚动到它们 尝试将 contentSize.y 设置为 0,这将禁用垂直滚动。 AlwaysBounceVertical 默认为 false。我认为也许滚动视图的高度和 contentSize 的高度并不相同(可能是浮动的)。您可以设置 intValue 来测试框架高度和 ContentSize 的高度。 @Paruru 试过了。它消除了按钮下方的空白,但我仍然可以垂直向上滚动,因为我的按钮上方有空白 【参考方案1】:

尝试将 contentSize 的高度设置为 scrollView 的高度。然后应该禁用垂直滚动,因为没有任何东西可以垂直滚动。

scrollView.contentSize = CGSizeMake(scrollView.contentSize.width,scrollView.frame.size.height);

【讨论】:

【参考方案2】:

设置 scheduleBar.contentSize = (到你想要的高度,这样它就没有足够的空间来上下滚动)

喜欢:

scheduleBar.frame = CGRectMake(宽度: 100, 高度: 200);

scheduleBar.contentSize = CGSizeMake(scheduleBar.contentSize.width,scheduleBar.frame.size.height);

//应该禁用垂直和水平滚动

【讨论】:

以上是关于如何禁用垂直滚动 UIScrollView?的主要内容,如果未能解决你的问题,请参考以下文章

Objective-C:如何在 UIScrollView 中禁用垂直滚动

快速禁用 UIScrollView 中的垂直滚动?

在 UIScrollView Swift 中禁用垂直滚动

使用 NavigationBar 禁用 UIScrollView 垂直滚动

UIScrollView 仅在底部禁用垂直反弹

UIView 不会在 UIScrollView 内垂直滚动