滚动事件后标签文本未更新

时间:2018-01-24 14:52:06

标签: ios swift xcode scrollview

我正在尝试在滚动事件后更新标签的文本。我有一个打印命令打印正确的值但标签没有更新。 这是我的代码

func scrollViewDidEndDecelerating(_ scrollView: UIScrollView) {
    let x = scrollView.contentOffset.x
    let w = scrollView.bounds.size.width
    let p = Int(x/w)
    print("page \(p)")   // this prints correct value
    self.signalLabel.text = signalText[Int(x/w)]  // this does not update
}
这是什么交易?

这是完整的视图控制器代码。通过在初始视图控制器上单击按钮来调用此视图。该视图包含UIScrollView和UIPageControl。 UIScrollView包含两个可以来回滚动的图像。我想根据显示的图像更新标签文本。

import UIKit

class SignalOneViewController: UIViewController, UIScrollViewDelegate {

// MARK: Properties
@IBOutlet weak var signalScrollView: UIScrollView!
@IBOutlet weak var signalPageControl: UIPageControl!
@IBOutlet weak var signalLabel: UILabel!

// MARK: - Button Actions
@IBAction func signalOneButton(_ sender: Any) {
    print("signal one button clicked")
    performSegue(withIdentifier: "SignalOneSegue", sender: self)
}
@IBAction func onCancelButton(_ sender: Any) {
    dismiss(animated: true, completion: nil)
}


let signalImages = ["signal1a.png", "signal1b.png"]
let signalText = ["Ready for play", "Untimed down"]

override func viewDidLoad() {
    super.viewDidLoad()

    // Do any additional setup after loading the view.
}

override func viewDidLayoutSubviews() {
    self.loadScrollView()
}

override func didReceiveMemoryWarning() {
    super.didReceiveMemoryWarning()
    // Dispose of any resources that can be recreated.
}

func loadScrollView() {
    let pageCount : CGFloat = CGFloat(signalImages.count)
    signalLabel.text = signalText[0]

    signalScrollView.backgroundColor = UIColor.clear
    signalScrollView.delegate = self
    signalScrollView.isPagingEnabled = true
    signalScrollView.contentSize = CGSize(width: signalScrollView.frame.size.width * pageCount, height: signalScrollView.frame.size.height)
    signalScrollView.showsHorizontalScrollIndicator = false
    signalScrollView.showsVerticalScrollIndicator = false

    signalPageControl.numberOfPages = Int(pageCount)
    signalPageControl.pageIndicatorTintColor = UIColor.lightGray
    signalPageControl.currentPageIndicatorTintColor = UIColor.blue
    signalPageControl.addTarget(self, action: #selector(self.pageChanged), for: .valueChanged)

    for i in 0..<Int(pageCount) {
        print(self.signalScrollView.frame.size.width)
        let image = UIImageView(frame: CGRect(x: self.signalScrollView.frame.size.width * CGFloat(i), y: 0, width: self.signalScrollView.frame.size.width, height: self.signalScrollView.frame.size.height))
        image.image = UIImage(named: signalImages[i])!
        image.contentMode = UIViewContentMode.scaleAspectFit
        self.signalScrollView.addSubview(image)
    }
}

//MARK: UIScrollView Delegate
func scrollViewDidScroll(_ scrollView: UIScrollView) {
    let viewWidth: CGFloat = scrollView.frame.size.width
    // content offset - tells by how much the scroll view has scrolled.
    let pageNumber = floor((scrollView.contentOffset.x - viewWidth / 50) / viewWidth) + 1
    signalPageControl.currentPage = Int(pageNumber)
}

func scrollViewDidEndDecelerating(_ scrollView: UIScrollView) {
    let x = scrollView.contentOffset.x
    let w = scrollView.bounds.size.width
    let p = Int(x/w)
    print("page \(p)")
    self.signalLabel.text = signalText[p]
    print(">>> \(signalText[Int(x/w)])")
}

//MARK: page tag action
@objc func pageChanged() {
    let pageNumber = signalPageControl.currentPage
    var frame = signalScrollView.frame
    frame.origin.x = frame.size.width * CGFloat(pageNumber)
    frame.origin.y = 0
    signalScrollView.scrollRectToVisible(frame, animated: true)
}

}

1 个答案:

答案 0 :(得分:0)

确保在storyboard或xib中将signalLabe IBOutlet 附加到您的标签上

相关问题