2015-02-20 8 views
7

Ich bin brandneu auf iOS-Entwicklung und ich versuche, ein Projekt, das ich auf Android zu iOS haben. Ich versuche, eine CollectionView in Code als Teil der Implementierung zu erstellen. Die Sache ist, wie die Daten in jeder Zelle in der Sammlungsansicht unterschiedliche String-Größen sein können jede Zelle kann eine andere Größe sein, es ist Nachbar. Ich experimentiere mit dem angehängten Code, aber mir ist aufgefallen, dass bei einem iPhone 6 entweder ein physikalisches Gerät oder im Simulator die Benutzeroberfläche wie erwartet aussieht. Sonst sieht es fürchterlich kaputt aus. Es scheint der sizeForIndexItemAtPath zu sein, der es bricht. Irgendwelche Ideen irgendjemand? TIAiOS collectionView.sizeForItemAtIndexPath Breaks auf alles vor dem iPhone 6

import UIKit 

    class ViewController: UIViewController,  UICollectionViewDelegateFlowLayout, UICollectionViewDataSource { 

    var collectionView: UICollectionView? 
    var thisCellHeight: CGFloat = 0.0 

    override func viewDidLoad() { 
     super.viewDidLoad() 
     // Do any additional setup after loading the view, typically from a nib. 
     let screenSize: CGRect = UIScreen.mainScreen().bounds 
     let screenWidth = screenSize.width 
     let screenHeight = screenSize.height 

     var thisWidth = screenWidth - 10 

     let layout: UICollectionViewFlowLayout = UICollectionViewFlowLayout() 
     layout.sectionInset = UIEdgeInsets(top: 70, left: 10, bottom: 10, right: 10) 
     layout.itemSize = CGSize(width: thisWidth, height: 120) 
     collectionView = UICollectionView(frame: self.view.frame, collectionViewLayout: layout) 
     //collectionView!.backgroundView?.backgroundColor = UIColor.blueColor() 
     collectionView!.dataSource = self 
     collectionView!.delegate = self 
     collectionView!.registerClass(UICollectionViewCell.self, forCellWithReuseIdentifier: "Cell") 
     collectionView!.backgroundColor = hexStringToUIColor("#15ADFF") 
     self.view.addSubview(collectionView!) 
    } 

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

    func collectionView(collectionView: UICollectionView, numberOfItemsInSection section: Int) -> Int { 
     return 14 
    } 

    func collectionView(collectionView: UICollectionView, cellForItemAtIndexPath indexPath: NSIndexPath) -> UICollectionViewCell { 



     let cell = collectionView.dequeueReusableCellWithReuseIdentifier("Cell", forIndexPath: indexPath) as UICollectionViewCell 
     cell.backgroundColor = UIColor.whiteColor() 

     var typeLabel = UILabel(frame: CGRectMake(10, 0, 200, 21)) 
     typeLabel.text = "Card Type" 
     typeLabel.font = typeLabel.font.fontWithSize(20) 
     cell.addSubview(typeLabel) 

     var titleLabel = UILabel(frame: CGRectMake(10, 25, 300, 21)) 

     titleLabel.text = "This Is The Article Title. This Is The Article Title. This Is The Article Title. This Is The Article Title." 
     titleLabel.font = titleLabel.font.fontWithSize(20) 
     titleLabel.numberOfLines = 0 
     titleLabel.sizeToFit() 
     self.thisCellHeight = CGFloat(titleLabel.frame.height) 
     println("The title text is \(self.thisCellHeight) high") 
     cell.addSubview(titleLabel) 

     var authorLabel = UILabel(frame: CGRectMake(10, thisCellHeight + 30, 200, 21)) 
     authorLabel.text = "This Is The Article Author" 
     authorLabel.font = authorLabel.font.fontWithSize(15) 
     cell.addSubview(authorLabel) 

     var timestampLabel = UILabel(frame: CGRectMake(10, thisCellHeight + 50, 200, 21)) 
     timestampLabel.text = "This Is The Timestamp" 
     timestampLabel.font = timestampLabel.font.fontWithSize(15) 
     cell.addSubview(timestampLabel) 

     return cell 
    } 

    func hexStringToUIColor (hex:String) -> UIColor { 
     var cString:String = hex.stringByTrimmingCharactersInSet(NSCharacterSet.whitespaceAndNewlineCharacterSet() as NSCharacterSet).uppercaseString 

     if (cString.hasPrefix("#")) { 
      cString = cString.substringFromIndex(advance(cString.startIndex, 1)) 
     } 

     if (countElements(cString) != 6) { 
      return UIColor.grayColor() 
     } 

     var rgbValue:UInt32 = 0 
     NSScanner(string: cString).scanHexInt(&rgbValue) 

     return UIColor(
      red: CGFloat((rgbValue & 0xFF0000) >> 16)/255.0, 
      green: CGFloat((rgbValue & 0x00FF00) >> 8)/255.0, 
      blue: CGFloat(rgbValue & 0x0000FF)/255.0, 
      alpha: CGFloat(1.0) 
     ) 
    } 

    func collectionView(collectionView: UICollectionView, layout collectionViewLayout: UICollectionViewLayout, sizeForItemAtIndexPath indexPath: NSIndexPath) -> CGSize { 


     return CGSizeMake(320, 350) 


    } 



} 
+0

Können Sie erklären (vielleicht Screenshots) von dem, was Sie erwarten, im Gegensatz zu dem, was Sie sehen? – Alex

+0

Nun, würdest du es glauben ... Ich habe letzte Nacht so spät gearbeitet und den Tag aufgegeben. Ich habe gerade Xcode geöffnet, um die Screenshots zu machen und der Code funktioniert jetzt ... –

+0

Ich habe es repariert, während du geschlafen hast. Ich habe diesen Kommentar geschrieben, um Sie aufzufordern, Xcode zu öffnen. – Alex

Antwort

9

Sie die Einstellung der Objektgröße auf dem Layout zu sein:

layout.itemSize = CGSize(width: thisWidth, height: 120) 

Und Sie auch die Methode delegieren

func collectionView(collectionView: UICollectionView, layout collectionViewLayout: UICollectionViewLayout, sizeForItemAtIndexPath indexPath: NSIndexPath) -> CGSize { 
    return CGSizeMake(320, 350) 
} 

Die erste wird überschrieben mit durch der Zweite. layout.itemSize ist die Standardgröße für jedes Element, wenn die Delegate-Methode sizeForItemAtIndexPath nicht überschrieben wird. Sie überschreiben die layout.itemSize mit etwas, das ganz anders aussieht. Versuchen Sie, nur die Delegiertenfunktion zu entfernen sizeForItemAtIndexPath, tut dies, was Sie erwarten?