在 UIScrollView 中调整多行 UILabel 的大小会中断滚动。为什么?

安德烈·赫福德

我使用以下设置:

  • ViewControllers 视图包含UIScrollViewTop、Leading、Trailing 和 Bottom 约束以匹配 VC 的大小
  • ScrollView 包含两个子视图:
    • AUIView定义滚动视图的内容大小。它的高度与 ScrollView 相同,但宽度是其两倍。因此只能水平滚动。
    • 一个UILabel有些长文本具有高度和宽度约束到一个固定的大小和顶部和领先的约束设置为滚动型设置一个固定的位置。
  • 当 ScrollView 滚动时,Label 的宽度会发生变化。

问题:如果将 Label 设置为使用多行并且contenOffset手动设置ScrollViews属性,则 ScrollView 将停止滚动。

ViewController View
+---------------------+
|+-------------------+| 
||ScrollView         ||
||+------------------||--------------------+
|||UIView to define  || content size       |
|||                  ||                    |
|||                  ||                    |
|||  [MultiLine]     ||                    |
|||  [  Label  ]     ||                    |
|||                  ||                    |
||+------------------||--------------------+
|+-------------------+|
+---------------------+


- (void)viewDidLayoutSubviews {
    [super viewDidLayoutSubviews];

    // Setting the ContentOffset will stop scrolling 
    //[self.scrollView setContentOffset:CGPointMake(0, 0)];
}

- (void)scrollViewDidScroll:(UIScrollView *)scrollView {
    // Resize Label when scrolling
    self.labelWidthConstraint.constant = MAX (50, 50 + self.scrollView.contentOffset.x);
}

使用此代码调整标签大小工作正常,如果

  • 标签设置使用一行在这种情况下,设置内容偏移量不会造成任何伤害。或者
  • 内容偏移量未更改(甚至未设置为(0, 0))。在这种情况下,将标签设置为多行不会造成任何伤害

设置内容偏移并采用多线同时DOES NOT工作。无法再滚动滚动条。

为什么是这样?知道什么可能导致这种情况以及如何解决吗?

阿吉布森007

问题似乎是,当标签约束更改时,它会触发 viewDidLayoutSubviews,然后将 UIScrollView 设置为不滚动,因为 set contentOffset 然后被一遍又一遍地调用。如果您只想通过使用 bool 作为标志,在初始布局上将 UIScrollView 设置为 CGPoint.zero,您可以克服这个问题。显然,由于 UILabel 需要在大小更改时重绘它会触发 viewDidLayoutSubviews。这是 Swift 中的一个示例。

import UIKit

class ViewController: UIViewController {

    lazy var scrollView : UIScrollView = {
        let sv = UIScrollView(frame: self.view.bounds)
        sv.translatesAutoresizingMaskIntoConstraints = false
        sv.delegate = self
        return sv
    }()

    lazy var contentView : UIView = {
        let v = UIView(frame: CGRect(x: 0, y: 0, width: self.view.bounds.width * 4, height: self.view.bounds.height))
        v.translatesAutoresizingMaskIntoConstraints = false
        return v
    }()

    lazy var label : UILabel = {
        let lbl = UILabel(frame: CGRect(x: 0, y: 0, width: self.view.bounds.width, height: 50))
        lbl.numberOfLines = 0
        lbl.text = "Lorem Ipsum is simply dummy text of the printing and typesetting industry. Lorem Ipsum has been the industry's standard dummy text ever since the 1500s"
        lbl.minimumScaleFactor = 0.5
        lbl.adjustsFontSizeToFitWidth = true
        lbl.font = UIFont.systemFont(ofSize: 22)
        lbl.translatesAutoresizingMaskIntoConstraints = false
        return lbl
    }()

    var widthConstraint : NSLayoutConstraint?
    var heightConstraint : NSLayoutConstraint?
    var startingHeight : CGFloat = 0
    var startingWidth : CGFloat = 0
    override func viewDidLoad() {
        super.viewDidLoad()
        //first scrollview
        self.view.addSubview(scrollView)
        pinToAllSides(target: scrollView)

        //now content view
        self.scrollView.addSubview(contentView)
        contentView.widthAnchor.constraint(equalTo: self.view.widthAnchor, multiplier: 2).isActive = true
        contentView.heightAnchor.constraint(equalTo: self.scrollView.heightAnchor, multiplier: 1).isActive = true
        contentView.backgroundColor = .green
        pinToAllSides(target: contentView)
        scrollView.layoutIfNeeded()

        //now the label
        self.scrollView.addSubview(label)
        label.leadingAnchor.constraint(equalTo: self.scrollView.leadingAnchor, constant: 20).isActive = true
        label.topAnchor.constraint(equalTo: self.scrollView.topAnchor, constant: 60).isActive = true
        label.backgroundColor = .red
        widthConstraint = NSLayoutConstraint(item: label, attribute: .width, relatedBy: .equal, toItem: nil, attribute: .notAnAttribute, multiplier: 1, constant: self.view.bounds.width/2)

        heightConstraint = NSLayoutConstraint(item: label, attribute: .height, relatedBy: .equal, toItem: nil, attribute: .notAnAttribute, multiplier: 1, constant: 300)
        if let wc = widthConstraint,
            let hc = heightConstraint{
            startingHeight = hc.constant
            startingWidth = wc.constant
            label.addConstraint(wc)
            label.addConstraint(hc)
        }

    }

    func pinToAllSides(target:UIView){
        guard let superview = target.superview else{
            return
        }
        target.leadingAnchor.constraint(equalTo: superview.leadingAnchor).isActive = true
        target.trailingAnchor.constraint(equalTo: superview.trailingAnchor).isActive = true
        target.topAnchor.constraint(equalTo: superview.topAnchor).isActive = true
        target.bottomAnchor.constraint(equalTo: superview.bottomAnchor).isActive = true
    }

    var hasHappenedOnce : Bool = false
    override func viewDidLayoutSubviews() {
        super.viewDidLayoutSubviews()
        if hasHappenedOnce == false{
            hasHappenedOnce = true
            self.scrollView.contentOffset = .zero
        }
    }
}

extension ViewController : UIScrollViewDelegate{

    func scrollViewDidScroll(_ scrollView: UIScrollView) {
        //hopefully it is laggy due to simulator but for the label i would ditch constraints myself
        self.widthConstraint?.constant = max(startingWidth, self.scrollView.contentOffset.x * 1.1 + startingWidth)

        let height = startingHeight - self.scrollView.contentOffset.x
        self.heightConstraint?.constant = height
        label.updateConstraints()
    }
}

本文收集自互联网,转载请注明来源。

如有侵权,请联系[email protected] 删除。

编辑于
0

我来说两句

0条评论
登录后参与评论

相关文章

来自分类Dev

如何调整 UIScrollView 的大小以适应 UILabel 中未知数量的文本?

来自分类Dev

在UIScrollView中滚动UIScrollView

来自分类Dev

UIscrollView中的UILabel无法识别UISwipegesture

来自分类Dev

UIscrollView中的UILabel无法识别UISwipegesture

来自分类Dev

在UIScrollView中自动调整UITextView的大小

来自分类Dev

使用AutoLayout在UIScrollView中调整UIView的大小以进行滚动吗?

来自分类Dev

Swift:将UILabel添加到UIScrollView无法滚动

来自分类Dev

以编程方式滚动 UIScrollView,使 UILabel 位于导航栏下方

来自分类Dev

在UIPickerView中调整UILabel的大小以适合

来自分类Dev

无法将UILabel包装在UIScrollView中的UIView中

来自分类Dev

滚动包含UIScrollView的UIScrollView时,是什么使UIView重新调整为默认大小?

来自分类Dev

为什么此中断UILabel会调整FontSizeToFitWidth?

来自分类Dev

调整UILabel的大小以适应插图

来自分类Dev

根据文本调整UILabel的大小

来自分类Dev

自动调整大小UILabel文字

来自分类Dev

使用UIScrollView中的动态内容调整UiView高度的大小(快速)

来自分类Dev

将UIScrollView中的内部视图调整为ScrollView的外部大小

来自分类Dev

如何在UIScrollView中调整子视图的大小?

来自分类Dev

使用UIScrollView中的动态内容调整UiView高度的大小(快速)

来自分类Dev

为什么我的UIScrollView中的UIView无法滚动?

来自分类Dev

调整UILabel中的文本

来自分类Dev

通过UIViewRepresentable(如文本)在SwiftUI中调整UILabel的大小以换行

来自分类Dev

调整后的UITableViewCell中的UILabel大小显示错误

来自分类Dev

UIScrollView无法在Swift中滚动

来自分类Dev

uiview中的uiscrollview不滚动

来自分类Dev

缩放后调整uiscrollview的大小,以启用分页

来自分类Dev

UIPageViewController中的UIScrollView:UIScrollView滚动时无法滑动页面

来自分类Dev

UILabel不会在具有自动布局的UIScrollView中自动换行

来自分类Dev

UILabel根据文本大小自动调整大小

Related 相关文章

  1. 1

    如何调整 UIScrollView 的大小以适应 UILabel 中未知数量的文本?

  2. 2

    在UIScrollView中滚动UIScrollView

  3. 3

    UIscrollView中的UILabel无法识别UISwipegesture

  4. 4

    UIscrollView中的UILabel无法识别UISwipegesture

  5. 5

    在UIScrollView中自动调整UITextView的大小

  6. 6

    使用AutoLayout在UIScrollView中调整UIView的大小以进行滚动吗?

  7. 7

    Swift:将UILabel添加到UIScrollView无法滚动

  8. 8

    以编程方式滚动 UIScrollView,使 UILabel 位于导航栏下方

  9. 9

    在UIPickerView中调整UILabel的大小以适合

  10. 10

    无法将UILabel包装在UIScrollView中的UIView中

  11. 11

    滚动包含UIScrollView的UIScrollView时,是什么使UIView重新调整为默认大小?

  12. 12

    为什么此中断UILabel会调整FontSizeToFitWidth?

  13. 13

    调整UILabel的大小以适应插图

  14. 14

    根据文本调整UILabel的大小

  15. 15

    自动调整大小UILabel文字

  16. 16

    使用UIScrollView中的动态内容调整UiView高度的大小(快速)

  17. 17

    将UIScrollView中的内部视图调整为ScrollView的外部大小

  18. 18

    如何在UIScrollView中调整子视图的大小?

  19. 19

    使用UIScrollView中的动态内容调整UiView高度的大小(快速)

  20. 20

    为什么我的UIScrollView中的UIView无法滚动?

  21. 21

    调整UILabel中的文本

  22. 22

    通过UIViewRepresentable(如文本)在SwiftUI中调整UILabel的大小以换行

  23. 23

    调整后的UITableViewCell中的UILabel大小显示错误

  24. 24

    UIScrollView无法在Swift中滚动

  25. 25

    uiview中的uiscrollview不滚动

  26. 26

    缩放后调整uiscrollview的大小,以启用分页

  27. 27

    UIPageViewController中的UIScrollView:UIScrollView滚动时无法滑动页面

  28. 28

    UILabel不会在具有自动布局的UIScrollView中自动换行

  29. 29

    UILabel根据文本大小自动调整大小

热门标签

归档