[Swift 2] Visa flera raders text cell?

Trädvy Permalänk
Medlem
Plats
Halmstad
Registrerad
Apr 2003

[Swift 2] Visa flera raders text cell?

Tja!

Håller på & gör en Flappy Bird (är riktigt färsk när det kommer till iOS utveckling) kopia till barnen i släkten inför julen & har stött på ett problem, eller ja, en massa problem.

Jag har fått allt att fungera som det skall, sprites som animeras & fysiken för fågeln osv osv & är inne på slutspurten nu.

Det ENDA jag vill göra är att vissa lite text som visar highscoren för alla spelare men Apple verkar fullkomligt hata folk som vill visa lite text, iaf för mig.

Detta är vad jag vill åstadkomma http://i.imgur.com/riYNZHG.jpg (ignorera all text förutom #1, #2, #3, det är den texten jag vill implementera)

Vad jag testat:

UILabel
Fungerar relativt bra men gör jag en label som är 300x400 så centreras texten vertikalt, Googlade som fasen, men fick inte till någon bra lösning där texten börjar i topp & radas neråt samtidigt som allt är centrerat horisontellt, sizeToFit verkar inte gå att implementera allt för lätt

SKLabel
Njaaa? Verkade inte gå att få till radbrytningar? Tolkar varken radbrytning från JSON med \n eller manuell \n

UITextView
Skitbra tänkte jag, här har vi något som jag bara kan dumpa in lite text i men nja, denna verkar snarare endast vara för text som användaren kan peta på, även med editable = false så går det ändå marker, kopiera & klippa & klistra

Såhär ser koden ut för det jag har

let label:UITextView = UITextView(frame: CGRectMake(view.frame.size.width / 2, view.frame.size.height / 2, view.frame.size.width, 400)); label.backgroundColor = UIColor(red: 255, green: 0, blue: 0, alpha: 1) label.font = UIFont(name: "Arial", size: 20) label.text = "#1 Jesper (32)\n#2 Jonny (12)\n#3 Ingrid (5)"; label.textColor = UIColor(red: 255, green: 255, blue: 255, alpha: 1) label.editable = false label.sizeToFit() self.view!.addSubview(label);

UITextView resulterade i (säg till om bilderna är för stora):

Detta är NÄSTAN så som jag vill ha det när det gäller placering & text, fast skulle vilja ha lite större line-height men min Googling failade mig där med. Dessutom skulle jag vilja få rutan placerad absolut i mitten oavsett hur brett innehållet är, view.frame.size.width / 2 - (self.frame.size.width / 2) fungerade inte. Jag kan lösa centreringen genom att göra rutan like bred som skärmen, enkel fix men är inte det jag är ute efter nu för vill ändå ha texten relativt i mitten utan att texten i sig är centrerad, kanske kan göra multipla UITextView och placera dom i varandra, men lite stökigt.

Detta verkar vara omöjligt att implementera I en SKScene

Jag vill INTE skicka spelaren till en ny view, jag vill visa highscoren direkt när man "dör". UITextView tar dessutom över scenen, just nu börjar man om spelet genom att tappa på skärmen efter man dött, men klickar man på UITextView rutan så registrerar inte "klicket".

Så ja, jag vill BARA visa lite text från JSON data jag hämtar från min webbserver, så att summera:

En textruta som kan:
Visa flera rader text
Där jag kan bestämma rad höjden
Rutan skall helst kunna köra sizeToFit så den anpassas efter innehållet
Den skall INTE vara klickbar, touchesBegan skall ALLTID vara "överst" i scenen

Så japp, någon som kan peka mig åt rätt håll?

Hur kan syltkakor överleva i det vilda utan ögon?

Trädvy Permalänk
Medlem
Plats
hemma
Registrerad
Maj 2006
  • För att uppnå den en custom layout är det alltid bättre att bygga upp den av flera komponenter, i detta fall UILabels. Då kan du också enkelt justera marginalen mellan dessa (det som du nu försöker uppnå med "lineheight").

  • För att få en UIView (eller subklass av UIView) att ignorera touches kan du sätta

    userInteractionEnabled = false

Trädvy Permalänk
Medlem
Plats
Halmstad
Registrerad
Apr 2003

Tack för svaret

Funderade på att slänga upp en massa labels för ett tag sedan men tyckte det verkade så sjukt stökigt, blir ju en hel del labels, eller, ja, skall ju visa top 5 på highscoren så minimum blir det ju 5 labels, inte så farligt MEN skulle jag härma layouten för UITableView så blir det ju runt 3 labels per spelare, men men, blir ju så jag får göra då för verkar inte finnas någon "renare" lösning.

Hämtar JSON data för top 5 i highscoren & konverterar till NSDictionary, då skall jag alltså iterera över alla spelare & skapa en helt ny label i varje iteration, alla med en egen position?

Just nu har jag bara så den hämtar spelarens egna highscore:

do { let jsonData = try NSJSONSerialization.JSONObjectWithData(data!, options:NSJSONReadingOptions.MutableContainers ) as! NSDictionary let ResultPlayer = String(jsonData["player"]!); let ResultScore = String(jsonData["score"]!) self.PlayerLabel.fontName = "Helvetica" self.PlayerLabel.fontSize = 30 self.PlayerLabel.text = "Ditt rekord: \(ResultScore)" self.PlayerLabel.position = CGPointMake(self.frame.width / 2, self.frame.height - (self.frame.height / 2 / 1.5)) self.PlayerLabel.zPosition = 99 self.addChild(self.PlayerLabel) } catch _ { }

Så nu skall jag alltså hämta top 5 från webbserven, få tillbaka 5 player objekt, iterera över alla i tex en for loop & i varje loop skall jag lägga till

self.PlayerLabel.fontName = "Helvetica" self.PlayerLabel.fontSize = 30 self.PlayerLabel.text = "Ditt rekord: \(ResultScore)" self.PlayerLabel.position = CGPointMake(self.frame.width / 2, self.frame.height - (self.frame.height / 2 / 1.5)) self.PlayerLabel.zPosition = 99 self.addChild(self.PlayerLabel)

Fast ändra positionen genom att ha en itereringscounter som adderar ett fast värde (effektivt resulterar det i nästkommande label får en position neranför föregående label med ett fast värde jag bestämmer, så typ lineheight i praktiken)?

Har jag fattat ungefär rätt? Inte snyggaste tycker jag men kommer nog fungera

Hur kan syltkakor överleva i det vilda utan ögon?