2016-07-11 10 views
0

Ich habe eine UIScrollView, die ich Paging-Funktionalität haben möchte (denke, eine erste Splash-Bildschirm). Ich möchte, dass dieser Inhalt (ein UILabel und ein UIImageView) in jeder Paging-Ansicht in der scrollView zentral platziert wird. Mein Problem ist, dass es immer etwas außerhalb der Mitte ist (picture here). HierPaging UIScrollView scheint Inhalte aus der Mitte zu setzen

ist der vollständige Code:

var splashScreenObjects = [SplashScreenObject]() 

    var imageViewArray = [UIImageView]() 
    var subtitleViewArray = [UILabel]() 

    @IBOutlet var scrollView: UIScrollView! 
    @IBOutlet var pageControl: UIPageControl! 

    override func viewDidLoad() { 
    super.viewDidLoad() 
    createSplashScreenObjects() 
    configurePageControl() 
    configureScrollView() 
    } 

    func createSplashScreenObjects() { 
    let firstScreen: SplashScreenObject = SplashScreenObject(subtitle: "Medication reminders on your phone. Never miss your next dose", image: UIImage(named: "splashScreen1")!) 
    let secondScreen: SplashScreenObject = SplashScreenObject(subtitle: "Track how good you have been with your medication", image: UIImage(named: "splashScreen2")!) 
    let thirdScreen: SplashScreenObject = SplashScreenObject(subtitle: "The better you are with your medication, the more points you'll earn!", image: UIImage(named: "splashScreen3")!) 
    splashScreenObjects.append(firstScreen) 
    splashScreenObjects.append(secondScreen) 
    splashScreenObjects.append(thirdScreen) 

    } 

    func configureScrollView() { 
    self.scrollView.layoutIfNeeded() 

    self.scrollView.showsHorizontalScrollIndicator = false 
    self.scrollView.showsVerticalScrollIndicator = false 

    self.scrollView.pagingEnabled = true 
    self.scrollView.delegate = self 

    let width = view.frame.size.width 

    for index in 0..<splashScreenObjects.count { 
     let subtitle = UILabel(frame: CGRectMake((width * CGFloat(index)) + 25, self.scrollView.frame.size.height-75, width-50, 75)) 
     subtitle.text = splashScreenObjects[index].subtitle 
     subtitle.textAlignment = NSTextAlignment.Center 
     subtitle.textColor = UIColor.whiteColor() 
     subtitle.font = UIFont(name:"Ubuntu", size: 16) 
     subtitle.numberOfLines = 2 
     subtitle.backgroundColor = UIColor.clearColor() 
     self.scrollView.addSubview(subtitle) 
     self.subtitleViewArray.append(subtitle) 
     subtitle.alpha = 0 

     let mainImage = UIImageView(frame: CGRectMake((width * CGFloat(index)), 50, width, self.scrollView.frame.size.height-150)) 
     mainImage.image = splashScreenObjects[index].image 
     mainImage.contentMode = UIViewContentMode.ScaleAspectFit 
     self.scrollView.addSubview(mainImage) 
     self.imageViewArray.append(mainImage) 
     mainImage.alpha = 0 
    } 

    self.scrollView.contentSize = CGSizeMake(width * CGFloat(splashScreenObjects.count), self.scrollView.frame.size.height-50) 
    animateViews(Int(0)) 

    } 

    func configurePageControl() { 
    self.pageControl.numberOfPages = splashScreenObjects.count 
    self.pageControl.currentPage = 0 
    self.view.addSubview(pageControl) 
    pageControl.addTarget(self, action: #selector(SplashViewController.changePage(_:)), forControlEvents: UIControlEvents.ValueChanged) 
    } 

    func changePage(sender: AnyObject) ->() { 
    let x = CGFloat(pageControl.currentPage) * self.view.frame.size.width 
    scrollView.setContentOffset(CGPointMake(x, 0), animated: true) 
    } 

    func scrollViewDidEndDecelerating(scrollView: UIScrollView) { 
    let pageNumber = round(scrollView.contentOffset.x/self.view.frame.size.width) 
    pageControl.currentPage = Int(pageNumber) 
    animateViews(Int(pageNumber)) 
    } 

    func animateViews(pageNumber: Int) { 
    UIView.animateWithDuration(0.5, animations: { 
     self.imageViewArray[pageNumber].alpha = 1.0 
     self.subtitleViewArray[pageNumber].alpha = 1.0 
    }) 
    } 

Hier mein Auto Layoutbeschränkungen für die UIScrollView sind:

enter image description here

+0

Besser ist in diesem Fall die Verwendung von UICollectionView. – Igor

Antwort

0

Ihre vorderen und hinteren Räume sind beide -20, die, dass die Spiraleinrichtung View ist 40 Punkte breiter als sein Superview. Ändern Sie diese auf 0

+0

Ich habe dies versucht, und das Ergebnis, das ich mit übrig habe, ist dies: https://imgur.com/fEGBmUz – spogebob92

+1

Dies ist nicht wahr, das -20 ist, weil die Einschränkungen relativ zum Rand des Su-Viewview sind (das ist 20). Das -20 ist dasselbe wie das Setzen von Einschränkungen von 0 auf die Grenzen der Superview. – Fogmeister

+0

Das war auch mein Verständnis, aber ich bin kein Experte – spogebob92

0

Sie ersetzen sollte

self.scrollView.layoutIfNeeded() 

zu

self.view.layoutIfNeeded() 

weil layoutIfNeeded Layout Anrufer Subviews, nicht selbst. ScrollView hat also einen falschen Frame, wenn Sie Untertitel und mainImage hinzufügen.

+0

Leider löst dies keine Probleme – spogebob92

+0

versuchen Sie nach 'Let Breite = view.frame.size.width' einfügen' Print (Breite) 'und' print (self .scrollView.frame) ', was sind die Ergebnisse? – Igor