Frage

Ich verwende Autolayout in meiner benutzerdefinierten TableViewCell, die mit einer xib-Datei erstellt wurde. Es sieht so aus:

enter image description here

Alles funktioniert wie erwartet und wird korrekt angezeigt, aber ich erhalte viele Warnmeldungen, wenn ich in der TableView nach unten scrolle:

Einschränkungen können nicht gleichzeitig erfüllt werden.Wahrscheinlich ist mindestens eine der Einschränkungen in der folgenden Liste eine, die Sie nicht möchten.Versuche dies:(1) Schauen Sie sich jede Einschränkung an und versuchen Sie herauszufinden, welche Sie nicht erwarten;(2) Finden Sie den Code, der die unerwünschte(n) Einschränkung(en) hinzugefügt hat, und beheben Sie ihn.(Notiz:Wenn Sie Nsautores -Masklayoutconstraints sehen, die Sie nicht verstehen, beziehen Sie sich auf die Dokumentation für die UIView -Eigenschaft TranslateSizes -Mascintoconstraints) () (

"<NSLayoutConstraint:0xc3970d0 V:[UIImageView:0xc396fc0(75)]>",
"<NSLayoutConstraint:0xc3c1dc0 V:|-(10)-[UIImageView:0xc396fc0]   (Names: '|':UITableViewCellContentView:0xc396f20 )>",
"<NSLayoutConstraint:0xc3c1fc0 V:[UIImageView:0xc3b7700]-(0)-|   (Names: '|':UITableViewCellContentView:0xc396f20 )>",
"<NSLayoutConstraint:0xc3c1ff0 V:[UIImageView:0xc396fc0]-(43)-[UIImageView:0xc3b7700]>",
"<NSAutoresizingMaskLayoutConstraint:0xc3bf8c0 h=--& v=--& V:[UITableViewCellContentView:0xc396f20(126.5)]>"
)

Will attempt to recover by breaking constraint 

<NSLayoutConstraint:0xc3970d0 V:[UIImageView:0xc396fc0(75)]>

Break on objc_exception_throw to catch this in the debugger.
The methods in the UIConstraintBasedLayoutDebugging category on UIView listed in    <UIKit/UIView.h> may also be helpful.

Besonders interessant finde ich den folgenden Teil:

Will attempt to recover by breaking constraint 
<NSLayoutConstraint:0xc3970d0 V:[UIImageView:0xc396fc0(75)]>

Das Problem ist also die Höhe meiner UIImageview oben links???Ich habe versucht, die Höhe und viele andere Dinge zu löschen, aber das Notieren hat bei mir absolut funktioniert. Was kann ich tun?Ich möchte eine feste Größe für meine UIImageView oben links ...

BEARBEITEN:Möglicherweise liegt das Problem darin, dass die untere UIImageView optional ist und manchmal ausgeblendet ist, was möglicherweise zu den Warnungen führt ...

Der wichtige Teil meines Codes:

- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:    (NSIndexPath *)indexPath{

    static NSString *CellIdentifier1 = @"NewsCell";


    GTNewsCustomCell *newsCell = [tableView dequeueReusableCellWithIdentifier:CellIdentifier1];

    NSString *bottomImage = [[self.newsList objectAtIndex:indexPath.section] valueForKey:@"boardnoteImage"];

    if(bottomImage == (NSString *)[NSNull null] || bottomImage == nil || bottomImage.length == 0){

        newsCell.bottomImage.hidden = YES;
        newsCell.bottomImage.image = nil;
        newsCell.bottomConstraint.constant = 0.0f;

        [newsCell layoutIfNeeded];
    } else {

        newsCell.bottomConstraint.constant = 19.0f;
        newsCell.bottomImage.hidden = NO;
        [newsCell layoutIfNeeded];

        [newsCell.contentView addSubview:newsCell.boardNoteImage];

    }


    newsCell.titleLabel.text = [[self.newsList objectAtIndex:indexPath.section]objectForKey:@"title"];

    newsCell.messageText = [[self.newsList objectAtIndex:indexPath.section]objectForKey:@"previewMessage"];

    NSString *authorImg = [[self.newsList objectAtIndex:indexPath.section] valueForKey:@"objectImage"];


    return newsCell;
  }

EDIT 2:Ich habe einige Änderungen vorgenommen und die Höhenberechnung für die Zelle lautet jetzt:

-(CGFloat)tableView:(UITableView *)tableView heightForRowAtIndexPath:(NSIndexPath *)indexPath {

NSString *bottomImage = [[self.newsList objectAtIndex:indexPath.section] valueForKey:@"boardnoteImage"];

//Check if the bottom Image exists
if(bottomImage == (NSString *)[NSNull null] || bottomImage == nil || bottomImage.length == 0){
//        if it not exists the cell should be smaller
    return 128.0f;
}
//if the image exists the size should be 250
return 250;

}

BEARBEITEN:3

ENDLICH es funktioniert jetzt.Ich habe zwei Lösungen.Die erste besteht darin, die Zellenhöhe auf 148,0f einzustellen. Um ehrlich zu sein, habe ich keine Ahnung, warum, vielleicht ein paar seltsame Einfügungen aus meiner UITextView?).Und die zweite Lösung besteht darin, die untere Einschränkung des unteren Bildes zu löschen und eine feste Höhe für das untere Bild festzulegen!

War es hilfreich?

Lösung

Ihr aktuelles Setup an Einschränkungen ergibt den Schlusspunkt UIImageView eine Höhe von -1,5.

Zweite Regel von AutoLayout: Es darf keine Negative geben!

Sie können dies anhand der Fehlermeldung erkennen.

Von oben nach unten (der UITableViewCell) haben Sie ...

  • Eine Lücke von 10.
  • Eine Höhe von 75.
  • Eine Lücke von 43.
  • Eine variable Höhe (Dies ist die große Bildansicht)
  • Eine Lücke von 0.

Das ergibt 128.

Jetzt haben Sie auch eine Gesamthöhe der Zelle von oben nach unten von 126,5.

Die einzige Möglichkeit, diese zu erfüllen, besteht darin, die variable Höhe der Bildansicht auf -1,5 festzulegen. DAS KANN NICHT GEMACHT WERDEN Es verstößt gegen die zweite Regel von AutoLayout.Daher wählt es eine Einschränkung aus, von der es glaubt, dass sie hilfreich sein könnte, und entfernt sie.Daher erhalten Sie wahrscheinlich eine Bildansichtshöhe von 0 oder so.

Sie müssen die Einschränkungen ändern oder die Zellenhöhe auf 128 festlegen.

Andere Tipps

Ich habe Ihr Layout in einem Beispielprojekt dupliziert und die einzige Möglichkeit, Ihr Problem zu reproduzieren, bestand darin, dies einzufügen cellForRowAtIndexPath:

cell.translatesAutoresizingMaskIntoConstraints = NO;

Versuchen Sie in diesem Fall, es zu entfernen.Ich hatte keine Zeit, mich mit den Details zu befassen, um zu verstehen, warum das Layout dadurch zu stark eingeschränkt wird.Aber im Allgemeinen denke ich, dass eine gute Faustregel darin besteht, diesen Standardwert nicht zu ändern, da die Tabellenansicht das Layout der Zelle selbst besitzt.Sie besitzen nur das Layout des Inhalts.

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top