2015-01-23 2 views
6

In meiner App habe ich die Constraints einer UIView so eingerichtet, dass ihre Höhe anhand der Seitenverhältniseinschränkung aus ihrer Breite berechnet wird. Es funktioniert perfekt auf iOS8 mit jedem Gerät Bildschirmgröße (3.5, 4, 4.7, 5.5), aber es verursacht die App auf jedem iOS7-Gerät abstürzen.iOS-Seitenverhältniseinschränkung bricht auf iOS7, funktioniert auf iOS8

Ich nehme an, es ist das Seitenverhältnis Einschränkung, denn wenn ich es durch eine feste Höhe Einschränkung ersetzen, stürzt es nicht mehr ab (offensichtlich sieht es auf einigen Geräten schlecht aus).

Der Stack-Trace ist extrem lang, also kopiere ich nur Teile davon.

Vielen Dank im Voraus für Ihre Hilfe!

Objective: {objective 0x7f9d90da33c0: <750:4692, 251:2936, 250:367> + <251:-1>*0x7f9d90c06220.marker{id: 592} + <251:-1>*0x7f9d90c24420.marker{id: 599} + <251:-1>*0x7f9d90c25650.marker{id: 594} + <251:-1>*0x7f9d90c27ad0.marker{id: 597} + <750:-1>*0x7f9d90c3b270.marker{id: 483} + <250:-3.9875>*0x7f9d90c43e40.marker{id: 618} + <250:-3.9875>*0x7f9d90c43e90.marker{id: 620} + <750:-4>*0x7f9d90c442e0.marker{id: 479} + <251:1>*0x7f9d90c464b0.marker{id: 485} + <251:-1>*0x7f9d90c46bf0.marker{id: 504} + <251:-1>*0x7f9d90c46c90.marker{id: 508} + <251:-1>*0x7f9d90c46ce0.marker{id: 510} + <251:-1>*0x7f9d90c46d80.marker{id: 514} + <251:-2>*0x7f9d90c4aa60.marker{id: 623} + <251:-2>*0x7f9d90c4aab0.marker{id: 625} + <251:-2, 250:-3.9875>*0x7f9d90c4ab50.marker{id: 631} + <251:-2, 250:-3.9875>*0x7f9d90c4abf0.marker{id: 634} + <251:4, 250:3.9875>*0x7f9d90c4ac40.marker{id: 637} + <251:4, 250:3.9875>*0x7f9d90c4ac90.marker{id: 642} + <750:1, 251:1>*0x7f9d90c4c530.negError{id: 645} + <750:1, 251:1>*0x7f9d90c4cb20.posErrorMarker{id: 646} + <750:1, 251:1>*0x7f9d90c530f0.negError{id: 649} + <750:1, 251:1>*0x7f9d90c53150.negError{id: 651} + <750:1, 250:1>*0x7f9d90c53820.posErrorMarker{id: 652} + <750:1, 250:1>*0x7f9d90c538a0.posErrorMarker{id: 654} + <750:1, 250:1>*0x7f9d90c53fd0.posErrorMarker{id: 656} + <750:1, 250:1>*0x7f9d90c54070.posErrorMarker{id: 658} + <750:1, 251:1>*0x7f9d90c54650.negError{id: 661} + <750:1>*0x7f9d90c546b0.negError{id: 663} + <251:1>*0x7f9d90c546b0.posErrorMarker{id: 662} + <750:1>*0x7f9d90c55230.negError{id: 665} + <251:1>*0x7f9d90c55230.posErrorMarker{id: 664} + <750:1, 251:1>*0x7f9d90c552b0.negError{id: 667} + <750:1, 251:1>*0x7f9d90d34300.posErrorMarker{id: 916} + <750:1>*0x7f9d90de48a0.marker{id: 738} + <250:-1>*0x7f9d90de48f0.marker{id: 740} + <250:-1>*0x7f9d90de4940.marker{id: 744} + <750:1>*0x7f9d90de4990.marker{id: 745} + <750:1>*0x7f9d90de4c70.marker{id: 718} + <750:1>*0x7f9d90de4cc0.marker{id: 720} + <250:-1 

...

Integralization Adjustments: 
0x7f9d93042a90.marker{id: 532} [<NSLayoutConstraint:0x7f9d93042a90 UIView:0x7f9d9303d590.width == 1.50943*UIView:0x7f9d9303d590.height>] -> 0.132066 
0x7f9d93042c70.marker{id: 546} [<NSLayoutConstraint:0x7f9d93042c70 UIButton:0x7f9d90de27a0.height == UIButton:0x7f9d93018ab0.height>] -> 1.000000 
0x7f9d93042d60.marker{id: 552} [<NSLayoutConstraint:0x7f9d93042d60 UIButton:0x7f9d9303dbf0.width == UIButton:0x7f9d93018ab0.width>] -> -1.000000 
0x7f9d93042db0.marker{id: 554} [<NSLayoutConstraint:0x7f9d93042db0 UIButton:0x7f9d9303dbf0.height == UIButton:0x7f9d93033b40.height>] -> 1.000000 
0x7f9d93042ea0.marker{id: 562} [<NSLayoutConstraint:0x7f9d93042ea0 UIButton:0x7f9d93033b40.width == UIButton:0x7f9d9303c500.width>] -> -1.000000 
0x7f9d930431c0.marker{id: 581} [<NSLayoutConstraint:0x7f9d930431c0 UIButton:0x7f9d9303c500.height == UIButton:0x7f9d93045880.height>] -> 1.000000 

    Statistics: 
    195 rows. Variable counts: 
      1 -> 59 
      2 -> 28 
      3 -> 3 
      4 -> 7 
      5 -> 4 
      6 -> 3 
      7 -> 3 
      8 -> 4 
      9 -> 8 
     10 -> 10 
     11 -> 11 
     12 -> 10 
     13 -> 7 
     14 -> 2 
     15 -> 3 
     16 -> 10 
     17 -> 17 
     18 -> 6 
}: internal error. Cannot find an outgoing row head for incoming head UIView:0x7f9d930332a0.Height{id: 981}, which should never happen.' 
*** First throw call stack: 
(
    0 CoreFoundation      0x000000011284d495 __exceptionPreprocess + 165 
    1 libobjc.A.dylib      0x000000011220699e objc_exception_throw + 43 
    2 CoreFoundation      0x000000011284d2ad +[NSException raise:format:] + 205 
    3 Foundation       0x0000000110dfb054 -[NSISEngine minimizeConstantInObjectiveRowWithHead:] + 178 
    4 Foundation       0x0000000110dfaf22 -[NSISEngine optimize] + 147 
    5 Foundation       0x0000000110f432e3 -[NSISEngine withBehaviors:performModifications:] + 192 
    6 UIKit        0x000000011126f889 -[UIView(Hierarchy) _postMovedFromSuperview:] + 321 
    7 UIKit        0x000000011126df42 __UIViewWasRemovedFromSuperview + 206 
    8 UIKit        0x000000011126db9e -[UIView(Hierarchy) removeFromSuperview] + 218 
    9 UIKit        0x0000000111330069 -[UINavigationController navigationTransitionView:didEndTransition:fromView:toView:] + 320 
    10 UIKit        0x0000000111328fdd __49-[UINavigationController _startCustomTransition:]_block_invoke + 138 
    11 UIKit        0x000000011187ec2a -[_UIViewControllerTransitionContext completeTransition:] + 78 
    12 UIKit        0x0000000111211da4 __53-[_UINavigationParallaxTransition animateTransition:]_block_invoke103 + 605 
    13 UIKit        0x00000001112746e8 -[UIViewAnimationBlockDelegate _didEndBlockAnimation:finished:context:] + 299 
    14 UIKit        0x000000011126068e -[UIViewAnimationState sendDelegateAnimationDidStop:finished:] + 235 
    15 UIKit        0x0000000111260941 -[UIViewAnimationState animationDidStop:finished:] + 78 
    16 UIKit        0x000000011ef6d4b7 -[UIViewAnimationStateAccessibility(SafeCategory) animationDidStop:finished:] + 48 
    17 QuartzCore       0x0000000110ac9134 _ZN2CA5Layer23run_animation_callbacksEPv + 310 
    18 libdispatch.dylib     0x000000011327772d _dispatch_client_callout + 8 
    19 libdispatch.dylib     0x00000001132673fc _dispatch_main_queue_callback_4CF + 354 
    20 CoreFoundation      0x00000001128ab289 __CFRUNLOOP_IS_SERVICING_THE_MAIN_DISPATCH_QUEUE__ + 9 
    21 CoreFoundation      0x00000001127f8854 __CFRunLoopRun + 1764 
    22 CoreFoundation      0x00000001127f7d83 CFRunLoopRunSpecific + 467 
    23 GraphicsServices     0x0000000114223f04 GSEventRunModal + 161 
    24 UIKit        0x000000011121be33 UIApplicationMain + 1010 
    25 Playchat       0x000000010fa89513 main + 115 
    26 libdyld.dylib      0x00000001134fa5c9 start + 1 
) 
libc++abi.dylib: terminating with uncaught exception of type NSException 
+0

Most schrecklich Bug jemals. – Konrad

Antwort

1

ich beschloß es auf folgende Weise:

meinen Panel Unter der Annahme, das gleiche auf dem iPhone 4, 4s aussehen, 5, 5 s, da sie das gleiche haben Breite, so dass ihr Seitenverhältnis zu derselben Höhe führt. Ich habe der Ansicht, der ich die Abhängigkeit für das Seitenverhältnis hinzugefügt habe, eine Höhenbeschränkung hinzugefügt. Unabhängig von der iOS-Version wird auf diesen Geräten die Ansicht mit der Höhenbeschränkung richtig angezeigt.

iPhone6 ​​und 6+ laufen nur unter iOS8 oder höher, wenn die Seitenverhältniseinschränkung nicht fehlschlägt, ich lösche einfach die Höheneinschränkung, wenn die iOS-Version 8 oder höher ist, sonst lösche ich die Seitenverhältniseinschränkung.

Es ist alles andere als elegant, aber löst das Problem auf einfache Weise.

+0

Vielleicht können Sie einen Fehlerbericht an Apple senden? ("Das sollte nie passieren" klingt wie das OS hat da was falsch gemacht?) –

0

Ich hatte diesen Absturz auf iOS7, wenn ich eine Kombination aus Seitenverhältnis, gleiche Höhe zu Container und Null oberen und unteren Abstand zu Container Einschränkungen hatte. Die Containerbeschränkung "Gleiche Höhe" war redundant, da sie auf den oberen und unteren Rand des Containers beschränkt war, sodass ich sie entfernte und der Absturz aufhörte. Es muss ein Fehler im Betriebssystem sein.

0

In der Tat muss dies OS (iOS 7) Fehler sein. Ich habe einige Tage Debugging Autolayout vollständig kollabiert (Hinweis: NO NSayout Ausnahmen). Ich bin auch fast zusammengebrochen.

Es war ALL aufgrund der Verwendung einiger Kombinationen von Einschränkungen zusammen mit Seitenverhältnis Einschränkungen.

Ich löse dies mit der Neugestaltung von UI ... Pain.

10

Das ist ein nerviger Bug, kostet mich auch viele Stunden. Ich hatte genau das gleiche Problem, die App lief in iOS 8 gut, stürzte aber in iOS 7.1 ab. Das Problem war eine Seitenverhältniseinschränkung für eine Bildlaufansicht. Nachdem wir viele verschiedene Dinge ausprobiert hatten, löste dies das Problem:

Der Absturz scheint das Ergebnis einer Gleitkommaberechnung zu sein, die irgendwann fehlschlägt. In meinem Fall hatte ich ein Seitenverhältnis von 16: 9 bzw. 9:16 definiert, was 0,5625 entspricht. Das Ändern des Multiplikators von 0.5625 auf 0.5624 behob das Problem, seither sind keine Abstürze mehr aufgetreten.

+0

Lol bei Lösung :-D. Wie auch immer, ich werde verrückt, um die Probleme auf iOS7 zu beheben. – sabiland

+1

lol yeah es ist total lächerlich, aber es war das einzige was es wirklich reparierte ... ich habe alles ausprobiert, was hier und auf ähnlichen posten vorgeschlagen wurde, aber nichts half ... ich bin mir sicher, dass meine einschränkungen richtig eingerichtet sind .. Lustiges Ding ist .. Schaltbreite und Höhe des Constraint tatsächlich milderte das Problem ein wenig, schien die App nur halb so oft zu crashen ... aber nichts erwarten, den Multiplikator zu ändern, wirklich löste es;) –

+0

Haben Sie den Multiplikator zu ändern ein "fester" Wert für jede AP-Beschränkung? Wie in, geändert von 9:16 auf 0.5624? Warum 0,5624 und nicht 0,5625, hat letzteres nicht funktioniert? – Konrad

0

Ich habe dieses Problem mit NSLayoutConstraint und Multiplikator auf iOS 7. Funktioniert perfekt auf iOS 8.

Ich benutze Multiplikator mit Wert 0,2 und es verursacht Fehler!

NSLayoutConstraint(item: BT_Facebook, 
       attribute: NSLayoutAttribute.Width, 
       relatedBy: .Equal, 
       toItem: nil, 
       attribute: .Width, 
      multiplier: 0.2, 
       constant: sizeBtRedeSociais) 

Die Lösung besteht darin, die Größe des Bildschirms und keine Prozentsätze zu verwenden.

var sizeBtRedeSociais = UIScreen.mainScreen().bounds.width/5 
var BT_FacebookWidth = NSLayoutConstraint(item: BT_Facebook, attribute: NSLayoutAttribute.Width, relatedBy: .Equal, toItem: nil, attribute: .Width, multiplier: 1, constant: sizeBtRedeSociais) 
var BT_TwitterWidth = NSLayoutConstraint(item: BT_Twitter, attribute: NSLayoutAttribute.Width, relatedBy: .Equal, toItem: nil, attribute: .Width, multiplier: 1, constant: sizeBtRedeSociais) 
var BT_InstagramWidth = NSLayoutConstraint(item: BT_Instagram, attribute: NSLayoutAttribute.Width, relatedBy: .Equal, toItem: nil, attribute: .Width, multiplier: 1, constant: sizeBtRedeSociais) 
var BT_GoogleWidth = NSLayoutConstraint(item: BT_Google, attribute: NSLayoutAttribute.Width, relatedBy: .Equal, toItem: nil, attribute: .Width, multiplier: 1, constant: sizeBtRedeSociais) 
var BT_YoutubeWidth = NSLayoutConstraint(item: BT_Youtube, attribute: NSLayoutAttribute.Width, relatedBy: .Equal, toItem: nil, attribute: .Width, multiplier: 1, constant: sizeBtRedeSociais) 
0

ich gelöst es Sie nicht Verhältnis selbst festgelegt. Sie sollten gleich setzen mit seinem Container Aber besser sollten Sie Höhenbeschränkung folgen iPhone 6 Sie müssen Outlet Constrain in Ihrer Klasse. In viewDidLoad müssen Sie mit DISPLAY_SCALE Multiplikator

DISPLAY_SCALE = UIScreen.mainScreen().bounds.width/375 

// 375 Breite des iPhone ist 6.

Warum Sie das tun müssen? Ich denke, iOS7 Verzögerung, wenn unsere Einschränkung berechnen. Und es ist falsch, wenn zeigen

Verwandte Themen