Search code examples
swiftuiscrollviewuilabeluipagecontrol

Multiple UILabel in Page Control


I am trying to do a scrollView + pageControl for multiple UILabel i.e. each view should have 2 UILabel - one for title and one for descriptions.

I am familiar with adding a single UILabel into scrollView + pageControl. The question is how do I add more than one UILabel into the scrollView's subview? I have the following code which works fine for a single UILabel:

@IBOutlet weak var bloggerReviewScrollView: UIScrollView!
@IBOutlet weak var bloggerReviewPageControl: UIPageControl!
var frame = CGRect(x: 0, y: 0, width: 0, height: 0)
var reviews: [Reviews] = [Reviews(name: "NameA", description: "DescriptionA", date: Date.init(), url: nil), Reviews(name: "NameB", description: "DescriptionB", date: Date.init(), url: nil)]

func updateReview() {
    reviewPageControl.numberOfPages = reviews.count
    for index in 0..<reviews.count {
        frame.origin.x = reviewScrollView.frame.size.width * CGFloat(index)
        frame.size = reviewScrollView.frame.size

        let reviewContent = UILabel(frame: frame)
        reviewContent.text = reviews[index].description
        reviewContent.numberOfLines = 0
        reviewScrollView.addSubview(reviewContent)
    }
    reviewScrollView.contentSize = CGSize(width: reviewScrollView.frame.size.width * CGFloat(reviews.count), height: reviewScrollView.frame.size.height)
    reviewScrollView.delegate = self
}

However, other than reviews[index].description, I also want to display reviews[index].name in a different label so that the style for that label is independent of the style of the description label in the view. Are there any ways for me to do so?

Thanks a bunch!


Solution

  • What you need is to decide where and how you want to display your both labels, meaning label frames, I have divided into two parts you can change the frame based on your requirement and create new Label instance and add that to your reviewScrollView

    func updateReview() {
      reviewPageControl.numberOfPages = reviews.count
      for index in 0..<reviews.count {
        frame.origin.x = reviewScrollView.frame.size.width * CGFloat(index)
        frame.size = reviewScrollView.frame.size
    
        //title lable
        ////set title frame based on your requirment
         let reviewLabelFrame = CGRect(x: frame.origin.x, y: 0, width: frame.width, height: frame.height/2)
        let titleLabel = UILabel(frame: reviewLabelFrame)
        titleLabel.text = reviews[index]. name // get name and set the title  
        titleLabel.numberOfLines = 0
        reviewScrollView.addSubview(titleLabel)
    
        //descriptions Label
    
        //set descriptions frame based on your requirment
        let desLableFram = CGRect(x: frame.origin.x, y: frame.height/2, width: frame.width, height: frame.height/2)
        let desLable = UILabel(frame: desLableFram)
        desLable.text = reviews[index].description //get description and set 
        desLable.numberOfLines = 0
        reviewScrollView.addSubview(desLable) //add your descriptions
    }
    

    you need to calculate the frames for both the label based on your requirement