Scrollen Sie UILabel wie ein Festzelt in einer Untersicht
Habe ich ein UILabel in der Haupt-Ansicht mit text - "Sehr Sehr langer text". Die Breite wäre 142, aber ich habe Sie verkürzt auf 55.
Grundsätzlich möchte ich zur Umsetzung ein Festzelt geben Sie scrollen, so schrieb ich code und fügen Sie ihn auf eine Untersicht, und animieren Sie es, innerhalb der Schranken der Sicht.
CODE --
CGRect tempLblFrame = _lblLongText.frame;
UIView *lblView = [[UIView alloc] initWithFrame:tempLblFrame];
//Add label to UIView at 0,0 wrt to new UIView
tempLblFrame.origin.x = 0;
tempLblFrame.origin.y = 0;
[_lblLongText setFrame:tempLblFrame];
[_lblLongText removeFromSuperview];
[lblView addSubview:_lblLongText];
//SetClipToBounds so that if label moves out of bounds of its superview, it wont be displayed
[lblView setClipsToBounds:YES];
[lblView setBackgroundColor:[UIColor cyanColor]];
[self.view addSubview:lblView];
Nach diesem bekomme ich diese Ausgabe auf dem simulator -->
Tritt das problem auf wenn ich versuche eine Animation mit diesem code -
tempLblFrame.origin.x = -_lblLongText.intrinsicContentSize.width;
[UIView animateWithDuration:2.0 delay:1.0 options:UIViewAnimationOptionCurveLinear
animations:^{
[_lblLongText setFrame:tempLblFrame];
}
completion:^(BOOL finished) {
NSLog(@"completed");
}];
Ich hatte gehofft, ich würde die gesamte "Sehr Sehr langer text", vielmehr nur "Sehr..." Schriftrollen von Links nach rechts.
Um dieses Problem zu lösen fügte ich eine Zeile code -
//Add label to UIView at 0,0 wrt to new UIView
tempLblFrame.origin.x = 0;
tempLblFrame.origin.y = 0;
tempLblFrame.size.width = _lblLongText.intrinsicContentSize.width; //THIS LINE WAS ADDED
[_lblLongText setFrame:tempLblFrame];
[_lblLongText removeFromSuperview];
[lblView addSubview:_lblLongText];
Ich dachte, der volle text wird in der neu hinzugefügten UIView und es würde Blättern richtig. Aber läuft im simulator hat mir dieses --
Wieder und "Sehr..." war das scrollen von Links nach rechts.
Was mache ich falsch? Bitte um Hilfe!!!
BEARBEITEN
Offenbar der Täter war AutoLayout.
Ich habe keine Ahnung, warum, aber sobald ich nicht aktiviert "Use Autolayout" für die Ansicht
in der XIB -, angefangen hat alles wie erwartet funktioniert. Einstellung
tempLblFrame.Herkunft.x = -_lblLongText.intrinsicContentSize.Breite; war
richtig funktioniert und so war die schriftrolle.Jede Erklärung hierzu!!?
- warum sind Sie nicht mit opensource-Steuerung, die alles hat, behoben? github.com/cbpowell/MarqueeLabel
- Erstens wollte ich versuchen, etwas auf meinem eigenen. Zweitens, ich habe, um änderungen an einem bestehenden Projekt, das eine Menge von labels. Anstelle des Entfernens jedes Etikett von jedem xib (iPad, iPhone), ich wollte versuchen, eine alternative, die weniger Aufwand
Du musst angemeldet sein, um einen Kommentar abzugeben.
Diese Frage ist möglicherweise Duplikat.
Obwohl es schön ist code-snippet geschrieben von Charles Powell für MarqueeLabel,
werfen Sie auch einen Blick auf Dieser link.
Ich hoffe, dies wird Ihnen helfen und wird Ihre Zeit sparen, indem Sie den gewünschten Ausgang.
Machen die
UILabel
die Breite (oder mehr) der text und dieUIView
den scroll-Bereich, den Sie sehen wollen. Legen Sie dann dieUIView
'sclipToBounds
zuYES
(was Sie tun). Dann beim animieren von Links nach rechts sehen Sie nur die der text die Breite desUIView
, da Sie schneiden die extra-Untersichten. Nur stellen Sie sicher, dass Sie einen Bildlauf über die gesamte Länge desUILabel
.Jetzt sind Sie Einstellung der Ansicht und Bezeichnung der Höhe und Breite die gleiche Sache. Das ist, warum Sie werden immer abgeschnitten text nicht abgeschnitten label.
tempLblFrame.size.width = _lblLongText.intrinsicContentSize.width;
ohne änderung der Herkunft ODER Ausrichtung.Fügen Sie Ihrer Ansicht scrollview und fügen Sie diese Aufkleber in Ihrem scroll-Ansicht .Verwenden Sie diesen code
Dieser code implementiert ist.Dank
[[UILabel alloc] init]
Offenbar der Täter war AutoLayout.
Ich habe keine Ahnung, warum, aber sobald ich nicht aktiviert "Use Autolayout" für den view in der XIB -, angefangen hat alles wie erwartet funktioniert. Einstellung
tempLblFrame.origin.x = -_lblLongText.intrinsicContentSize.width;
war richtig funktioniert und so war die schriftrolle.Immer noch, eine bessere Erklärung für dieses würde sicherlich helfen!!
EDIT: Lösung mit AutoLayout -