取消隐藏视图时出现iOS Autolayout致命错误NSInternalInconsistencyException

时间:2016-11-16 19:57:38

标签: ios swift

我正在使用具有3个视图的堆栈视图,一个是具有集群图标的GMS mapview,另外两个视图是具有多个嵌套堆栈视图的视图。当我在mapview上选择一个图标时,它将在动画块中取消隐藏其他两个视图中的一个或两个。

有时而且并非总是当我点击以在地图视图上选择群集图标时,它会导致以下崩溃错误。请参阅界面构建器中视图的附加图像。每个标签都使用高度约束,优先级为@ 999,以满足堆栈视图的歧义。

Story board interface builder.

Terminating app due to uncaught exception 'NSInternalInconsistencyException', reason: 'Attempt to rebuild engine with a pending list of constraints to remove.'
*** First throw call stack:
(
    0   CoreFoundation                      0x0000000111c5a34b __exceptionPreprocess + 171
    1   libobjc.A.dylib                     0x00000001116bb21e objc_exception_throw + 48
    2   CoreFoundation                      0x0000000111c5e442 +[NSException raise:format:arguments:] + 98
    3   Foundation                          0x0000000111251e4d -[NSAssertionHandler handleFailureInMethod:object:file:lineNumber:description:] + 195
    4   Foundation                          0x00000001113b64eb -[NSISEngine rebuildFromConstraints] + 195
    5   Foundation                          0x00000001111dde1a -[NSISEngine optimize] + 121
    6   Foundation                          0x00000001113b3f20 -[NSISEngine performPendingChangeNotifications] + 84
    7   UIKit                               0x000000011030bbef -[UIView(AdditionalLayoutSupport) _updateConstraintsIfNeededPostponeVariableChangeNotifications:] + 1357
    8   UIKit                               0x000000011030690a -[UIView(AdditionalLayoutSupport) _systemLayoutSizeFittingSize:withHorizontalFittingPriority:verticalFittingPriority:hasIntentionallyCollapsedHeight:] + 294
    9   UIKit                               0x000000010ff5c51c -[UIStackView _systemLayoutSizeFittingSize:withHorizontalFittingPriority:verticalFittingPriority:hasIntentionallyCollapsedHeight:] + 180
    10  UIKit                               0x000000010ff5ccb5 -[UIStackView _proportionalFillLengthForOrderedArrangement:relevantParentAxis:] + 112
    11  UIKit                               0x0000000110318302 -[_UIOrderedLayoutArrangement _setUpDimensionConstraintForItem:referenceItem:atIndex:] + 406
    12  UIKit                               0x00000001103191ad -[_UIOrderedLayoutArrangement _insertIndividualGuidesAndConstraintsAsNecessary] + 2215
    13  UIKit                               0x0000000110319f90 -[_UIOrderedLayoutArrangement _updateArrangementConstraints] + 1450
    14  UIKit                               0x000000011030c3e5 -[UIView(AdditionalLayoutSupport) _handleLayoutArrangementConstraintsIfNecessary] + 198
    15  UIKit                               0x000000011030c4c9 -[UIView(AdditionalLayoutSupport) _updateSystemConstraints] + 53
    16  UIKit                               0x000000010ff5c40d __32-[UIStackView updateConstraints]_block_invoke + 47
    17  UIKit                               0x000000011030aa9b -[UIView(AdditionalLayoutSupport) _withUnsatisfiableConstraintsLoggingSuspendedIfEngineDelegateExists:] + 117
    18  UIKit                               0x000000010ff5c3ce -[UIStackView updateConstraints] + 85
    19  UIKit                               0x000000011030af3e -[UIView(AdditionalLayoutSupport) _sendUpdateConstraintsIfNecessaryForSecondPass:] + 161
    20  UIKit                               0x000000011030b39d -[UIView(AdditionalLayoutSupport) _updateConstraintsIfNeededCollectingViews:forSecondPass:] + 860
    21  UIKit                               0x000000011030b2fa -[UIView(AdditionalLayoutSupport) _updateConstraintsIfNeededCollectingViews:forSecondPass:] + 697
    22  UIKit                               0x000000011030b2fa -[UIView(AdditionalLayoutSupport) _updateConstraintsIfNeededCollectingViews:forSecondPass:] + 697
    23  UIKit                               0x000000011030b2fa -[UIView(AdditionalLayoutSupport) _updateConstraintsIfNeededCollectingViews:forSecondPass:] + 697
    24  UIKit                               0x000000011030b2fa -[UIView(AdditionalLayoutSupport) _updateConstraintsIfNeededCollectingViews:forSecondPass:] + 697
    25  UIKit                               0x000000011030b2fa -[UIView(AdditionalLayoutSupport) _updateConstraintsIfNeededCollectingViews:forSecondPass:] + 697
    26  UIKit                               0x000000011030b2fa -[UIView(AdditionalLayoutSupport) _updateConstraintsIfNeededCollectingViews:forSecondPass:] + 697
    27  UIKit                               0x000000011030b2fa -[UIView(AdditionalLayoutSupport) _updateConstraintsIfNeededCollectingViews:forSecondPass:] + 697
    28  Foundation                          0x00000001111d7bd0 -[NSISEngine withBehaviors:performModifications:] + 155
    29  UIKit                               0x000000011030bc71 __97-[UIView(AdditionalLayoutSupport) _updateConstraintsIfNeededPostponeVariableChangeNotifications:]_block_invoke + 91
    30  UIKit                               0x000000011030aa9b -[UIView(AdditionalLayoutSupport) _withUnsatisfiableConstraintsLoggingSuspendedIfEngineDelegateExists:] + 117
    31  UIKit                               0x000000011030b757 -[UIView(AdditionalLayoutSupport) _updateConstraintsIfNeededPostponeVariableChangeNotifications:] + 181
    32  UIKit                               0x000000011030c84d -[UIView(AdditionalLayoutSupport) _updateConstraintsAtEngineLevelIfNeededPostponeVariableChangeNotifications:] + 356
    33  UIKit                               0x000000010f9e5ad3 -[UIView(Hierarchy) layoutBelowIfNeeded] + 198
    34  IslandWeatherNet                    0x000000010cd3db42 _TFFFC16IslandWeatherNet17MapViewController16toggleSummaryBarFPs9AnyObject_T_L_17toggleSummaryViewFT_T_U_FT_T_ + 386
    35  IslandWeatherNet                    0x000000010cd186f7 _TTRXFo___XFdCb___ + 39
    36  UIKit                               0x000000010f9eda6d +[UIView(UIViewAnimationWithBlocks) _setupAnimationWithDuration:delay:view:options:factory:animations:start:animationStateGenerator:completion:] + 581
    37  UIKit                               0x000000010f9ede0f +[UIView(UIViewAnimationWithBlocks) animateWithDuration:delay:usingSpringWithDamping:initialSpringVelocity:options:animations:completion:] + 187
    38  IslandWeatherNet                    0x000000010cd3d86c _TFFC16IslandWeatherNet17MapViewController16toggleSummaryBarFPs9AnyObject_T_L_17toggleSummaryViewfT_T_ + 1660
    39  IslandWeatherNet                    0x000000010cd3d10c _TFC16IslandWeatherNet17MapViewController16toggleSummaryBarfPs9AnyObject_T_ + 588
    40  IslandWeatherNet                    0x000000010cd3c22f _TFC16IslandWeatherNet17MapViewController16toggleStationBarfPs9AnyObject_T_ + 1247
    41  IslandWeatherNet                    0x000000010cd55aa9 _TFC16IslandWeatherNet17MapViewController14clusterManagerfTCSo17GMUClusterManager6didTapPSo14GMUClusterItem__T_ + 857
    42  IslandWeatherNet                    0x000000010cd55d9b _TToFC16IslandWeatherNet17MapViewController14clusterManagerfTCSo17GMUClusterManager6didTapPSo14GMUClusterItem__T_ + 75
    43  IslandWeatherNet                    0x000000010ccd7635 -[GMUClusterManager mapView:didTapMarker:] + 677
    44  CoreFoundation                      0x0000000111be105c __invoking___ + 140
    45  CoreFoundation                      0x0000000111be0ee1 -[NSInvocation invoke] + 289
    46  CoreFoundation                      0x0000000111bf8ed6 -[NSInvocation invokeWithTarget:] + 54
    47  IslandWeatherNet                    0x000000010cdf9d3b -[GMSDelegateForward forwardInvocation:] + 102
    48  CoreFoundation                      0x0000000111bdfa2e ___forwarding___ + 526
    49  CoreFoundation                      0x0000000111bdf798 _CF_forwarding_prep_0 + 120
    50  IslandWeatherNet                    0x000000010cd6c766 -[GMSMapView didTapMarker:] + 59
    51  IslandWeatherNet                    0x000000010cdb4812 -[GMSMarker wasTapped] + 57
    52  UIKit                               0x000000010fe75e41 -[UIGestureRecognizerTarget _sendActionWithGestureRecognizer:] + 57
    53  UIKit                               0x000000010fe7dbe0 _UIGestureRecognizerSendTargetActions + 109
    54  UIKit                               0x000000010fe7b6af _UIGestureRecognizerSendActions + 227
    55  UIKit                               0x000000010fe7a93b -[UIGestureRecognizer _updateGestureWithEvent:buttonEvent:] + 891
    56  UIKit                               0x000000010fe66a0e _UIGestureEnvironmentUpdate + 1395
    57  CoreFoundation                      0x0000000111bfee17 __CFRUNLOOP_IS_CALLING_OUT_TO_AN_OBSERVER_CALLBACK_FUNCTION__ + 23
    58  CoreFoundation                      0x0000000111bfed87 __CFRunLoopDoObservers + 391
    59  CoreFoundation                      0x0000000111be3b9e __CFRunLoopRun + 1198
    60  CoreFoundation                      0x0000000111be3494 CFRunLoopRunSpecific + 420
    61  GraphicsServices                    0x000000011592ba6f GSEventRunModal + 161
    62  UIKit                               0x000000010f933964 UIApplicationMain + 159
    63  IslandWeatherNet                    0x000000010ccfb78f main + 111
    64  libdyld.dylib                       0x0000000112b8068d start + 1
    65  ???                                 0x0000000000000001 0x0 + 1
)
libc++abi.dylib: terminating with uncaught exception of type NSException

当在地图视图上点击图标时,它将调用包含以下内容的方法。

mapView.animate(toLocation: station.position)
            toggleStationBar(clusterManager)


@IBAction func stationMoreLessToggleButton(_ sender: AnyObject) {
        stationMoreLessButton.setTitle(moreStationInfo ? " L " : " M ", for: UIControlState())

        func moreInfo() {
            UIView.animate(withDuration: 1.0, delay: 0, usingSpringWithDamping: 0.6, initialSpringVelocity: 10.0, options: [.curveEaseOut], animations: {
                self.uvIndexInsolationStackView.isHidden = false
                self.uvIndexInsolationStackView.alpha = 1.0
                self.distanceRainStackView.isHidden = false
                self.distanceRainStackView.alpha = 1.0
                self.timeContainer.isHidden = false
                self.timeContainer.alpha = 1.0
                self.stationStackView.layoutIfNeeded()
            }, completion: nil)
        }
        func lessInfo() {
            UIView.animate(withDuration: 1.0, delay: 0, usingSpringWithDamping: 0.6, initialSpringVelocity: 10.0, options: [.curveEaseOut], animations: {
                self.timeContainer.isHidden = true
                self.timeContainer.alpha = 0.0
                self.distanceRainStackView.isHidden = true
                self.distanceRainStackView.alpha = 0.0
                self.uvIndexInsolationStackView.isHidden = true
                self.uvIndexInsolationStackView.alpha = 0.0
                self.stationStackView.layoutIfNeeded()
            }, completion: nil)
        }
        if moreStationInfo {
            if isSummaryOpen {
                toggleSummaryBar(moreStationInfo as AnyObject)
            }
            moreInfo()
        } else {
            lessInfo()
        }
        moreStationInfo = !moreStationInfo
    }

    @IBAction func toggleStationBar(_ sender: AnyObject) {

        func toggleView() {
            isBarOpen = !isBarOpen
            stationCloseButton.setTitle(isBarOpen ? " X " : " + ", for: UIControlState())
            stationView.isHidden = isBarOpen ? false : true

            UIView.animate(withDuration: 1.0, delay: 0, usingSpringWithDamping: 0.6, initialSpringVelocity: 10.0, options: [.curveEaseOut], animations: {
                self.stationView.alpha = self.isBarOpen ? 1.0 : 0.0
                self.view.layoutIfNeeded()
                }, completion: nil)
        }
        if sender as! NSObject == clusterManager {
            if isBarOpen {
                //Animate fields but not title.
                UIView.animate(withDuration: 0.5, delay: 0, options: [.transitionFlipFromRight], animations: {
                    self.updateInfoBarLabels(observation: self.selectedObservation)
                    }, completion: nil)
            } else {
                toggleView()
                updateInfoBarLabels(observation: selectedObservation)
                if isSummaryOpen {
                    toggleSummaryBar(clusterManager)
                }
            }
        } else if sender as! NSObject == stationCloseButton {
            toggleView()
        } else if sender as! NSObject == mapView {
            if isBarOpen {
                toggleView()
            } else {
                return
            }
        }
    }


    @IBAction func toggleSummaryBar(_ sender: AnyObject) {

        func toggleSummaryView() {
            isSummaryOpen = !isSummaryOpen
            toggleSummaryButton.setTitle(isSummaryOpen ? " - " : " + ", for: UIControlState())
            if summaryView.isHidden {
                summaryView.isHidden = false
            }

            UIView.animate(withDuration: 1.0, delay: 0, usingSpringWithDamping: 0.6, initialSpringVelocity: 10.0, options: [.curveEaseOut], animations: {
                self.summaryListStackView.isHidden = self.isSummaryOpen ? false : true
                self.summaryView.layoutIfNeeded()
            }, completion: nil)
            self.summaryListStackView.alpha = self.isSummaryOpen ? 1.0 : 0.0 // Fixes views hanging around towards end of animation bounce.
        }
        if sender as! NSObject == toggleSummaryButton {
            if !moreStationInfo {
                stationMoreLessToggleButton(toggleSummaryButton)
            }
            toggleSummaryView()
        } else if sender as! NSObject == clusterManager {
            toggleSummaryView()
        } else {
            summaryView.isHidden = false
            toggleSummaryView()
        }

    }

1 个答案:

答案 0 :(得分:0)

我发现蓝绿色的高度为'#34; Station Name"查看高度约束优先级为1000.将此更改为999解决了问题。

垂直堆栈视图的所有其他高度限制都具有999的优先级,因此堆栈视图可以在动画期间折叠视图。