2013-08-28 4 views
5

mein Problem zu veranschaulichen, habe ich die folgende Grafik:Automatische Anordnung Verwirrung: Einschränkungen für Scroll mit WebView und Kopf-/Fußzeilen Ansichten

Now in 3D

Der schwarze Rand um das rote Quadrat soll der iPhone-Bildschirm sein . Im Inneren haben wir in rot eine UIScrollView, die größer als der Bildschirm ist. Es ist in der Tat so groß wie ein UIWebView, oben in gelb angezeigt. Die UIWebView ist eine Unteransicht der UIScrollView, mit Scrolling deaktiviert. Außerdem haben wir zwei blaue Ansichten, die ich gerne die Kopf- und Fußzeilenansichten nenne. Sie sind auch Unteransichten der UIScrollView, aber außerhalb der scrollbaren Grenzen.

Mein Problem ist jetzt: Wie konfiguriere ich die Auto-Layout-Einschränkungen dafür?

Ich habe bereits abgerufen die UIWebView Höhe verwaltet code from this answer verwendet wurde, und aktualisieren Sie dann die UIScrollView ‚s contentSize entsprechend. Dies ist jedoch keine wirklich gute Lösung, da die Breite des UIWebView nicht auf Breitenänderungen des UIScrollView reagiert.

ich es geschafft, auch die Einrichtung der Layoutbeschränkungen Header Ansicht wie so (mit Masonary):

[headerView makeConstraints:^(MASConstraintMaker *make) { 
    make.top.equalTo(@-100); 
    make.left.equalTo(@0); 
    make.width.equalTo(scrollView.width); 
    make.height.equalTo(@100); 
}]; 

jedoch die Fußzeile Ansicht Layout wie diese Einrichtung hat nicht funktioniert:

[changeView makeConstraints:^(MASConstraintMaker *make) { 
    make.top.equalTo(scrollView.bottom) 
    make.left.equalTo(@0); 
    make.width.equalTo(scrollView.width); 
    make.height.equalTo(@100); 
}]; 

Ich habe das Gefühl, dass das nicht zu schwierig sein kann, und würde mich über jemanden freuen, der sich mit dem Auto-Layout vertrauter fühlt. Vielen Dank!

Antwort

3

In Visual Format Sprache (VFL), würden die Einschränkungen:

[scrollView addConstraints:[NSLayoutConstraint constraintsWithVisualFormat:@"V:|-(-100)-[headerView(100)]" options:0 metrics:nil views:views]]; 
[scrollView addConstraints:[NSLayoutConstraint constraintsWithVisualFormat:@"V:[footerView(100)]-(-100)-|" options:0 metrics:nil views:views]]; 
[scrollView addConstraints:[NSLayoutConstraint constraintsWithVisualFormat:@"H:|[headerView]|" options:0 metrics:nil views:views]]; 
[scrollView addConstraints:[NSLayoutConstraint constraintsWithVisualFormat:@"H:|[footerView]|" options:0 metrics:nil views:views]]; 

Oder wenn Sie das @"V:[footerView(100)]-(-100)-|" VFL mit constraintWithItem Anrufe ersetzen würden, wäre es:

[footerView addConstraint:[NSLayoutConstraint constraintWithItem:footerView 
                 attribute:NSLayoutAttributeHeight 
                 relatedBy:NSLayoutRelationEqual 
                  toItem:nil 
                 attribute:NSLayoutAttributeNotAnAttribute 
                 multiplier:1.0 
                 constant:100.0]]; 

[scrollView addConstraint:[NSLayoutConstraint constraintWithItem:footerView 
                 attribute:NSLayoutAttributeBottom 
                 relatedBy:NSLayoutRelationEqual 
                  toItem:scrollView 
                 attribute:NSLayoutAttributeBottom 
                 multiplier:1.0 
                 constant:100.0]]; 

I Ich kann nicht sagen, warum Ihre Masonary-Implementierung nicht funktioniert, da ich mich nicht damit auskenne. Aber ich würde eines der oben genannten ausprobieren und dafür sorgen.

Ehrlich gesagt, beschreiben Sie die Einstellung der Höhe der Webansicht, und ich frage mich, ob Sie die Höhe Einschränkung der Webansicht (gut) oder ob Sie nur den Wert frame.size.height (schlecht) eingestellt haben. Sie haben jedoch nicht die Details zur Einstellung der Höhe der Webansicht mitgeteilt, sodass ich keinen weiteren Kommentar abgeben kann.

Unabhängig davon, ob Sie einschränkungsbasierte Probleme haben, gibt es zwei nützliche Diagnosetechniken. Wenn es immer noch nicht funktioniert, würde ich die App auf dem Simulator laufen, Pause, und dann an der (lldb) Aufforderung eingeben:

po [[UIWindow keyWindow] _autolayoutTrace] 

sollten Sie sehen, so etwas wie:

(lldb) po [[UIWindow keyWindow] _autolayoutTrace] 
$0 = 0x0715d6e0 
*<UIWindow:0x758aae0> 
| *<UIView:0x71630f0> 
| | *<UIScrollView:0x716a370> 
| | | *<HeaderView:0x716b860> 
| | | *<FooterView:0x716bbb0> 
| | | *<UIWebView:0x716c2b0> 
| | | | <_UIWebViewScrollView:0x7176a30> 
| | | | | ... 
| | | | | <UIWebBrowserView:0x797fe00> 
| | | <UIImageView:0x75e1360> 
| | | <UIImageView:0x75e2a60> 

Stellen Sie sicher, habe keine Warnungen dort.Wenn alles, was es in Ordnung aussieht, dann würde ich dann verwenden Sie den folgenden Befehl an der (lldb) prompt:

po [[UIWindow keyWindow] recursiveDescription] 

Sie so etwas wie sehen sollte:

(lldb) po [[UIWindow keyWindow] recursiveDescription] 
$1 = 0x071c0ea0 <UIWindow: 0x758aae0; frame = (0 0; 320 568); autoresize = W+H; layer = <UIWindowLayer: 0x758b770>> 
    | <UIView: 0x71630f0; frame = (0 20; 320 548); autoresize = RM+BM; layer = <CALayer: 0x7163180>> 
    | | <UIScrollView: 0x716a370; frame = (0 0; 320 548); clipsToBounds = YES; gestureRecognizers = <NSArray: 0x716b1d0>; layer = <CALayer: 0x716ad20>; contentOffset: {0, 16}> 
    | | | <HeaderView: 0x716b860; frame = (0 -100; 320 100); layer = <CALayer: 0x716b910>> 
    | | | <FooterView: 0x716bbb0; frame = (0 564; 320 100); layer = <CALayer: 0x716bee0>> 
    | | | <UIWebView: 0x716c2b0; frame = (0 8; 320 548); layer = <CALayer: 0x716c360>> 
    | | | | <_UIWebViewScrollView: 0x7176a30; frame = (0 0; 320 548); clipsToBounds = YES; autoresize = H; gestureRecognizers = <NSArray: 0x7177000>; layer = <CALayer: 0x7176c80>; contentOffset: {0, 0}> 
    | | | | | ... 
    | | | | | <UIWebBrowserView: 0x797fe00; frame = (0 0; 1024 1754); gestureRecognizers = <NSArray: 0x7173260>; layer = <UIWebLayer: 0x716d7f0>> 
    | | | | | | ... 
    | | | <UIImageView: 0x75e1360; frame = (1 540; 318 7); alpha = 0; opaque = NO; autoresize = TM; userInteractionEnabled = NO; layer = <CALayer: 0x75e2980>> 
    | | | <UIImageView: 0x75e2a60; frame = (312 32.5; 7 530.5); alpha = 0; opaque = NO; autoresize = LM; userInteractionEnabled = NO; layer = <CALayer: 0x75e2b00>> 

Werfen Sie einen Blick auf Ihre verschiedenen resultierenden frame Werte und Schau, was vor sich geht. Das kann Ihnen helfen, die Lösung zu diagnostizieren. Sie liefern uns nicht genügend Informationen, um das Problem zu diagnostizieren (Sie sagen uns, dass die Fußzeile nicht funktioniert hat, aber Sie sagen uns nicht, wo Ihre Einschränkungen sie platziert haben). Wenn Sie die obigen Befehle ausführen, können Sie genau bestimmen, wo Ihre Einschränkung Ihre Fußzeile platziert hat, und dann herausfinden, wie Sie das Problem von dort beheben können.

Hinweis, werden Sie sehen, dass meine headerView und footerView sind in diesen beiden Auflistungen als HeaderView und FooterView Klassen statt UIView zeigt sich. Bei der Diagnose von Abhängigkeitsproblemen ist es nützlich, wenn die Schlüsselsichten ihre eigene Klasse haben, also habe ich UIView Unterklassen ohne Implementierung definiert, aber wenn ich diese eindeutigen Unterklassen für meine Kopf- und Fußzeilenansicht verwende, ist es viel einfacher, die Ergebnisse der zu interpretieren über (lldb) Befehle.

@interface HeaderView : UIView 
@end 
@implementation HeaderView 
@end 

@interface FooterView : UIView 
@end 
@implementation FooterView 
@end 
+0

Danke für Ihre Antwort, ich habe es jetzt eingerichtet. Vielen Dank für die Debugging-Befehle, sie sind wirklich nützlich. – fabian789