在我的应用程序中,我设置了UIView的约束,其高度使用宽高比约束从其宽度计算。它在iOS8上完美适用于每个设备屏幕尺寸(3.5,4,4.7,5.5),但它会导致应用程序在每个iOS7设备上崩溃。
我认为它是宽高比约束,因为如果我用固定高度约束替换它,它不会再崩溃(显然它在某些设备上看起来很糟糕)。
堆栈跟踪非常长,所以我只复制它的一部分。
提前感谢您的帮助!
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 :(得分:10)
这是一个烦人的错误,也花了我很多时间。我有完全相同的问题,该应用程序在iOS 8中运行良好,但在iOS 7.1中崩溃。问题是滚动视图上的宽高比约束。在尝试了很多不同的东西之后,这终于解决了这个问题:
崩溃似乎是浮点计算在某些时候失败的结果。就我而言,我已经定义了16:9或更确切地说是9:16的宽高比,相当于0.5625。 将乘数从0.5625更改为0.5624解决了问题,此后不再出现崩溃。
答案 1 :(得分:1)
我通过以下方式解决了这个问题:
假设我的面板在iPhone 4,4s,5,5s上看起来相同,因为它们具有相同的宽度,因此它们的宽高比将导致相同的高度。我添加了一个高度约束到我添加宽高比约束的同一视图。因此,无论iOS版本如何,在这些设备上,视图都会看起来与高度约束一致。
iPhone6和6+仅在iOS8或更高版本上运行,其中宽高比约束不会失败,如果iOS版本为8或更高,我只是删除高度约束,否则我删除宽高比约束。
它远非优雅,但却以一种简单的方式解决了这个问题。
答案 2 :(得分:0)
当我有宽高比,容器高度相等以及容器约束的顶部和底部间距为零时,我在iOS7上发生了这次崩溃。容器约束的高度相等是多余的,因为它被约束到容器的顶部和底部,因此我将其删除并且崩溃停止。它必须是操作系统中的错误。
答案 3 :(得分:0)
确实,这必须是操作系统( iOS 7 )错误。我花了几天时间调试 autolayout完全折叠(注意:没有NSLayout例外)。我也几乎崩溃了。
由于使用了一些约束组合以及宽高比约束,所以它是全部。
我正在通过重新设计UI来解决这个问题......痛苦。
答案 4 :(得分:0)
我在iOS 7上遇到NSLayoutConstraint
和乘数问题。在iOS 8上完美运行。
我使用乘数值0.2,它会导致错误!
NSLayoutConstraint(item: BT_Facebook,
attribute: NSLayoutAttribute.Width,
relatedBy: .Equal,
toItem: nil,
attribute: .Width,
multiplier: 0.2,
constant: sizeBtRedeSociais)
解决方案是使用屏幕的大小,而不是百分比。
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)
答案 5 :(得分:0)
我解决了 你没有自己设定比例。您应该将其容器设置为相等 但更好的是你应该按照iPhone 6设置高度限制。 你必须在课堂上限制出口。在 viewDidLoad 中,您必须使用DISPLAY_SCALE
进行倍增 DISPLAY_SCALE = UIScreen.mainScreen().bounds.width / 375
// 375是iPhone 6的宽度。
你为什么要这样做?我认为iOS7在计算器时会延迟约束。显示
时错了