Skip to content

Allow set different widget layout for landscape portrait - #5693

Open
Vladyslav-lys wants to merge 60 commits into
masterfrom
allow_set_different_widget_layout_for_landscape_portrait
Open

Vladyslav-lys wants to merge 60 commits into
masterfrom
allow_set_different_widget_layout_for_landscape_portrait

Conversation

@Vladyslav-lys

Copy link
Copy Markdown
Contributor

No description provided.

Vladyslav-lys and others added 27 commits July 13, 2026 16:30
@Vladyslav-lys
Vladyslav-lys requested a review from tigrim August 25, 2026 13:18
@Vladyslav-lys Vladyslav-lys linked an issue Aug 25, 2026 that may be closed by this pull request
80 tasks
@tigrim

tigrim commented Aug 26, 2026

Copy link
Copy Markdown
Contributor

Code review notes (build was not run, per request):

  • The new Panels layout setting is saved but does not appear to be applied on the map. PanelsLayoutViewController writes the preference, but the runtime layout still assigns the top/bottom widget widths directly in OAMapInfoController.mm using isLandscapeIpadAware / kInfoViewLandscapeWidthPad / DeviceScreenWidth, and I do not see panelsLayoutMode read from the map layout path. As a result, selecting Wide/Compact in the UI looks successful but should not change the actual widget layout.

  • Independent portrait/landscape mode does not currently separate widget sets/order. The new per-orientation preferences only cover panelsLayoutMode; widget order still goes through the existing shared left/right/top/bottomWidgetPanelOrder preferences via WidgetsPanel.getOrderPreference(). This means editing widgets in Landscape will update the same storage used by Portrait, so the Independent mode does not provide different widget layouts.

  • Copy from Portrait/Landscape layout is exposed in the widgets menu when separate layouts are enabled, but the handler is still a TODO/no-op in WidgetsListViewController.copyWidgets(from:). Users can tap the action and nothing happens.

@@ -20,20 +20,38 @@ protocol MapButtonsDelegate: AnyObject {

@objc(OAConfigureScreenViewController)

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

remove OA


@objc(OAConfigureScreenViewController)
@objcMembers
class ConfigureScreenViewController: OABaseNavbarViewController, AppModeSelectionDelegate, WidgetStateDelegate, MapButtonsDelegate {

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Why was the superclass changed?

Copy link
Copy Markdown
Contributor Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

because OABaseNavbarSubviewViewController allows to insert segmented control to the needed place

row.title = panel.title
row.iconName = panel.iconName(for: screenLayoutMode)
row.setObj(panel, forKey: "panel")
row.iconTintColor = widgetsCount == 0 ? .iconColorDefault : appMode!.getProfileColor()

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

force unwrap


let transparencyRow = widgetsSection.createNewRow()
transparencyRow.title = localizedString("map_widget_transparent")
transparencyRow.key = "map_widget_transparent"

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

key to enum

import UIKit

final class DoubleImageHeaderCell: UITableViewCell {
@IBOutlet weak var leftBackgroundImageView: UIImageView!

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

private

@@ -229,6 +229,8 @@
274781F62DB92E3800EAE008 /* ColorsAppearanceCategory.swift in Sources */ = {isa = PBXBuildFile; fileRef = 274781F52DB92E3100EAE008 /* ColorsAppearanceCategory.swift */; };

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Unable to simultaneously satisfy constraints.
Probably at least one of the constraints in the following list is one you don't want.
Try this:
(1) look at each constraint and try to figure out which you don't expect;
(2) find the code that added the unwanted constraint or constraints and fix it.
(
"<NSLayoutConstraint:0xcb2c5f1b0 UIView:0xcca3c9dc0.width == 30 (active)>",
"<NSLayoutConstraint:0xcb2c5ec10 H:|-(16)-[UIStackView:0xcca3c9500] (active, names: '|':OsmAnd_Maps.SensorTextWidget:0xcb2c25c00 )>",
"<NSLayoutConstraint:0xcb2c5ec60 UIStackView:0xcca3c9500.trailing == OsmAnd_Maps.SensorTextWidget:0xcb2c25c00.trailing - 16 (active)>",
"<NSLayoutConstraint:0xcb2c5e940 UIView:0xcca3c8c40.width == UIStackView:0xcca3c8a80.width (active)>",
"<NSLayoutConstraint:0xcb2cec140 H:|-(0)-[UIStackView:0xcca3c8a80] (active, names: '|':UIView:0xcca3c8380 )>",
"<NSLayoutConstraint:0xcb2cec190 UIStackView:0xcca3c8a80.trailing == UIView:0xcca3c8380.trailing (active)>",
"<NSLayoutConstraint:0xcb2d1a990 'UISV-alignment' OADestinationBarWidget:0xcca205180.leading == UIStackView:0xcca3c8fc0.leading (active)>",
"<NSLayoutConstraint:0xcb2c5ff70 'UISV-alignment' OADestinationBarWidget:0xcca205180.leading == UIView:0xcca3c8c40.leading (active)>",
"<NSLayoutConstraint:0xcb2ca0000 'UISV-alignment' OADestinationBarWidget:0xcca205180.trailing == UIView:0xcca3c8c40.trailing (active)>",
"<NSLayoutConstraint:0xcb2ced130 'UISV-alignment' UIStackView:0xcca3c96c0.leading == UIStackView:0xcca3c9c00.leading (active)>",
"<NSLayoutConstraint:0xcb2ced180 'UISV-alignment' UIStackView:0xcca3c96c0.trailing == UIStackView:0xcca3c9c00.trailing (active)>",
"<NSLayoutConstraint:0xcb2d1aad0 'UISV-alignment' OADestinationBarWidget:0xcca205180.trailing == UIStackView:0xcca3c8fc0.trailing (active)>",
"<NSLayoutConstraint:0xcb2cecb40 'UISV-canvas-connection' UIStackView:0xcca3c9c00.leading == UIView:0xcca3c9dc0.leading (active)>",
"<NSLayoutConstraint:0xcb2cecb90 'UISV-canvas-connection' H:[UIView:0xcca3c9f80]-(0)-| (active, names: '|':UIStackView:0xcca3c9c00 )>",
"<NSLayoutConstraint:0xcb2ced090 'UISV-canvas-connection' UIStackView:0xcca3c9500.leading == UIStackView:0xcca3c96c0.leading (active)>",
"<NSLayoutConstraint:0xcb2ced0e0 'UISV-canvas-connection' H:[UIStackView:0xcca3c96c0]-(0)-| (active, names: '|':UIStackView:0xcca3c9500 )>",
"<NSLayoutConstraint:0xcb2ceec10 'UISV-canvas-connection' UIStackView:0xcca3c8fc0.leading == OsmAnd_Maps.SensorTextWidget:0xcb2c25c00.leading (active)>",
"<NSLayoutConstraint:0xcb2ceec60 'UISV-canvas-connection' H:[OsmAnd_Maps.RulerDistanceWidget:0xcb2c47100]-(0)-| (active, names: '|':UIStackView:0xcca3c8fc0 )>",
"<NSLayoutConstraint:0xcb2ceed00 'UISV-fill-equally' OsmAnd_Maps.CurrentTimeWidget:0xcb2c46a00.width == OsmAnd_Maps.SensorTextWidget:0xcb2c25c00.width (active)>",
"<NSLayoutConstraint:0xcb2ceeda0 'UISV-fill-equally' OsmAnd_Maps.RulerDistanceWidget:0xcb2c47100.width == OsmAnd_Maps.SensorTextWidget:0xcb2c25c00.width (active)>",
"<NSLayoutConstraint:0xcb2cecbe0 'UISV-spacing' H:[UIView:0xcca3c9dc0]-(12)-[UIView:0xcca3c9f80] (active)>",
"<NSLayoutConstraint:0xcb2ceecb0 'UISV-spacing' H:[OsmAnd_Maps.SensorTextWidget:0xcb2c25c00]-(0)-[OsmAnd_Maps.CurrentTimeWidget:0xcb2c46a00] (active)>",
"<NSLayoutConstraint:0xcb2ceed50 'UISV-spacing' H:[OsmAnd_Maps.CurrentTimeWidget:0xcb2c46a00]-(0)-[OsmAnd_Maps.RulerDistanceWidget:0xcb2c47100] (active)>",
"<NSLayoutConstraint:0xcb2d1af30 'UIView-Encapsulated-Layout-Width' UIView:0xcca3c8380.width == 97.5 (active)>"
)

Will attempt to recover by breaking constraint
<NSLayoutConstraint:0xcb2c5f1b0 UIView:0xcca3c9dc0.width == 30 (active)>

Make a symbolic breakpoint at UIViewAlertForUnsatisfiableConstraints to catch this in the debugger.
The methods in the UIConstraintBasedLayoutDebugging category on UIView listed in <UIKitCore/UIView.h> may also be helpful.

274781F62DB92E3800EAE008 /* ColorsAppearanceCategory.swift in Sources */ = {isa = PBXBuildFile; fileRef = 274781F52DB92E3100EAE008 /* ColorsAppearanceCategory.swift */; };
274C43F12DEDBA7100585952 /* OANextTurnWidget.xib in Resources */ = {isa = PBXBuildFile; fileRef = 274C43F02DEDBA7100585952 /* OANextTurnWidget.xib */; };
2753876E2ECDD0AD000CF0F3 /* VehicleAlgorithms.swift in Sources */ = {isa = PBXBuildFile; fileRef = 2753876D2ECDD0AD000CF0F3 /* VehicleAlgorithms.swift */; };
27584BF6302DE44B009AC53F /* DoubleImageHeaderCell.swift in Sources */ = {isa = PBXBuildFile; fileRef = 27584BF4302DE44B009AC53F /* DoubleImageHeaderCell.swift */; };

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Error retrieving battery status: result= 18 446 744 073 172 681 409 percent= 1 hasExternalConnected= 0 isCharging= 144 isFullyCharged= 149
Unable to simultaneously satisfy constraints.
Probably at least one of the constraints in the following list is one you don't want.
Try this:
(1) look at each constraint and try to figure out which you don't expect;
(2) find the code that added the unwanted constraint or constraints and fix it.
(
"<NSLayoutConstraint:0xcb3768550 UIView:0xcca3f2840.height == 0 (active)>",
"<NSLayoutConstraint:0xcb37685a0 UIView:0xcca3f2a00.height == 0 (active)>",
"<NSLayoutConstraint:0xcb37685f0 UIView:0xcca3f1f80.height == 0 (active)>",
"<NSLayoutConstraint:0xcb3768870 UILabel:0xcb36bce00.height >= 22 (active)>",
"<NSLayoutConstraint:0xcb3768b40 UIView:0xcca3f01c0.height == 0 (active)>",
"<NSLayoutConstraint:0xcb3768b90 UIView:0xcca3f0380.height == 0 (active)>",
"<NSLayoutConstraint:0xcb3768be0 UIView:0xcca3f0000.height == 0 (active)>",
"<NSLayoutConstraint:0xcb3768dc0 V:[UIStackView:0xcca3f2680]-(0)-| (active, names: '|':UITableViewCellContentView:0xcca3f24c0 )>",
Unable to simultaneously satisfy constraints.
Probably at least one of the constraints in the following list is one you don't want.
Try this:
(1) look at each constraint and try to figure out which you don't expect;
(2) find the code that added the unwanted constraint or constraints and fix it.
(
"<NSLayoutConstraint:0xcb3768550 UIView:0xcca3f2840.height == 0 (active)>",
"<NSLayoutConstraint:0xcb37685a0 UIView:0xcca3f2a00.height == 0 (active)>",
"<NSLayoutConstraint:0xcb3768a50 UILabel:0xcb36bd880.height >= 22 (active)>",
"<NSLayoutConstraint:0xcb37689b0 UIView:0xcca3f0c40.height == 0 (active)>",
"<NSLayoutConstraint:0xcb3768af0 UIView:0xcca3f08c0.height == 0 (active)>",
"<NSLayoutConstraint:0xcb3768b90 UIView:0xcca3f0380.height == 0 (active)>",
"<NSLayoutConstraint:0xcb3768be0 UIView:0xcca3f0000.height == 0 (active)>",
"<NSLayoutConstraint:0xcb3768dc0 V:[UIStackView:0xcca3f2680]-(0)-| (active, names: '|':UITableViewCellContentView:0xcca3f24c0 )>",
"<NSLayoutConstraint:0xcb3768e10 V:|-(0)-[UIStackView:0xcca3f2680] (active, names: '|':UITableViewCellContentView:0xcca3f24c0 )>",
"<NSLayoutConstraint:0xcb376a440 'UISV-alignment' UIButton:0xcca3a8f00.centerY == UIStackView:0xcca3f0a80.centerY (active)>",
"<NSLayoutConstraint:0xcb3769220 'UISV-canvas-connection' UIStackView:0xcca3f2bc0.top == UIView:0xcca3f2840.top (active)>",
"<NSLayoutConstraint:0xcb3769270 'UISV-canvas-connection' V:[UIView:0xcca3f2a00]-(0)-| (active, names: '|':UIStackView:0xcca3f2bc0 )>",
"<NSLayoutConstraint:0xcb37698b0 'UISV-canvas-connection' UIStackView:0xcca3f0a80.top == UIView:0xcca3f0c40.top (active)>",
"<NSLayoutConstraint:0xcb3769900 'UISV-canvas-connection' V:[UIView:0xcca3f08c0]-(0)-| (active, names: '|':UIStackView:0xcca3f0a80 )>",
"<NSLayoutConstraint:0xcb376a1c0 'UISV-canvas-connection' V:[_UILayoutSpacer:0xcafdbfd00'UISV-alignment-spanner']-(0)-| (active, names: '|':UIStackView:0xcca3f2140 )>",
"<NSLayoutConstraint:0xcb376a210 'UISV-canvas-connection' UIStackView:0xcca3f2140.centerY == UIButton:0xcca3a8f00.centerY (active)>",
"<NSLayoutConstraint:0xcb376a490 'UISV-canvas-connection' UIStackView:0xcca3f0540.top == UIView:0xcca3f0380.top (active)>",
"<NSLayoutConstraint:0xcb376a4e0 'UISV-canvas-connection' V:[UIView:0xcca3f0000]-(0)-| (active, names: '|':UIStackView:0xcca3f0540 )>",
"<NSLayoutConstraint:0xcb376a6c0 'UISV-canvas-connection' UIStackView:0xcca3f2680.top == UIStackView:0xcca3f2bc0.top (active)>",
"<NSLayoutConstraint:0xcb376a710 'UISV-canvas-connection' V:[UIStackView:0xcca3f0540]-(0)-| (active, names: '|':UIStackView:0xcca3f2680 )>",
"<NSLayoutConstraint:0xcb37692c0 'UISV-spacing' V:[UIView:0xcca3f2840]-(5)-[UIView:0xcca3f2a00] (active)>",
"<NSLayoutConstraint:0xcb3769950 'UISV-spacing' V:[UIView:0xcca3f0c40]-(4)-[UILabel:0xcb36bd880] (active)>",
"<NSLayoutConstraint:0xcb37699a0 'UISV-spacing' V:[UILabel:0xcb36bd880]-(4)-[UIView:0xcca3f08c0] (active)>",
"<NSLayoutConstraint:0xcb376a530 'UISV-spacing' V:[UIView:0xcca3f0380]-(5)-[UIView:0xcca3f0000] (active)>",
"<NSLayoutConstraint:0xcb376b0c0 'UISV-spacing' V:[UIStackView:0xcca3f2bc0]-(4)-[UIStackView:0xcca3f2140] (active)>",
"<NSLayoutConstraint:0xcb376b160 'UISV-spacing' V:[UIStackView:0xcca3f2140]-(4)-[UIStackView:0xcca3f0540] (active)>",
"<NSLayoutConstraint:0xcb376a120 'UISV-spanning-boundary' _UILayoutSpacer:0xcafdbfd00'UISV-alignment-spanner'.bottom >= UIStackView:0xcca3f0a80.bottom (active)>",
"<NSLayoutConstraint:0xcb376ac10 'UIView-Encapsulated-Layout-Height' UITableViewCellContentView:0xcca3f24c0.height == 40.04 (active)>"
)

Will attempt to recover by breaking constraint
<NSLayoutConstraint:0xcb3768a50 UILabel:0xcb36bd880.height >= 22 (active)>

Make a symbolic breakpoint at UIViewAlertForUnsatisfiableConstraints to catch this in the debugger.
The methods in the UIConstraintBasedLayoutDebugging category on UIView listed in <UIKitCore/UIView.h> may also be helpful.
Unable to simultaneously satisfy constraints.
Probably at least one of the constraints in the following list is one you don't want.
Try this:
(1) look at each constraint and try to figure out which you don't expect;
(2) find the code that added the unwanted constraint or constraints and fix it.
(
"<NSLayoutConstraint:0xcb3768550 UIView:0xcca3f2840.height == 0 (active)>",
"<NSLayoutConstraint:0xcb37685a0 UIView:0xcca3f2a00.height == 0 (active)>",
"<NSLayoutConstraint:0xcb3768780 UIImageView:0xcca55aa00.height == 30 (active)>",
"<NSLayoutConstraint:0xcb3768b90 UIView:0xcca3f0380.height == 0 (active)>",
"<NSLayoutConstraint:0xcb3768be0 UIView:0xcca3f0000.height == 0 (active)>",
"<NSLayoutConstraint:0xcb3768dc0 V:[UIStackView:0xcca3f2680]-(0)-| (active, names: '|':UITableViewCellContentView:0xcca3f24c0 )>",
"<NSLayoutConstraint:0xcb3768e10 V:|-(0)-[UIStackView:0xcca3f2680] (active, names: '|':UITableViewCellContentView:0xcca3f24c0 )>",
"<NSLayoutConstraint:0xcb376a3a0 'UISV-alignment' UIButton:0xcca3a8f00.centerY == UIImageView:0xcca55aa00.centerY (active)>",
"<NSLayoutConstraint:0xcb3769220 'UISV-canvas-connection' UIStackView:0xcca3f2bc0.top == UIView:0xcca3f2840.top (active)>",
"<NSLayoutConstraint:0xcb3769270 'UISV-canvas-connection' V:[UIView:0xcca3f2a00]-(0)-| (active, names: '|':UIStackView:0xcca3f2bc0 )>",
"<NSLayoutConstraint:0xcb376a170 'UISV-canvas-connection' UIStackView:0xcca3f2140.top == _UILayoutSpacer:0xcafdbfd00'UISV-alignment-spanner'.top (active)>",
"<NSLayoutConstraint:0xcb376a210 'UISV-canvas-connection' UIStackView:0xcca3f2140.centerY == UIButton:0xcca3a8f00.centerY (active)>",
"<NSLayoutConstraint:0xcb376a490 'UISV-canvas-connection' UIStackView:0xcca3f0540.top == UIView:0xcca3f0380.top (active)>",
"<NSLayoutConstraint:0xcb376a4e0 'UISV-canvas-connection' V:[UIView:0xcca3f0000]-(0)-| (active, names: '|':UIStackView:0xcca3f0540 )>",
"<NSLayoutConstraint:0xcb376a6c0 'UISV-canvas-connection' UIStackView:0xcca3f2680.top == UIStackView:0xcca3f2bc0.top (active)>",
"<NSLayoutConstraint:0xcb376a710 'UISV-canvas-connection' V:[UIStackView:0xcca3f0540]-(0)-| (active, names: '|':UIStackView:0xcca3f2680 )>",
"<NSLayoutConstraint:0xcb37692c0 'UISV-spacing' V:[UIView:0xcca3f2840]-(5)-[UIView:0xcca3f2a00] (active)>",
"<NSLayoutConstraint:0xcb376a530 'UISV-spacing' V:[UIView:0xcca3f0380]-(5)-[UIView:0xcca3f0000] (active)>",
"<NSLayoutConstraint:0xcb376b0c0 'UISV-spacing' V:[UIStackView:0xcca3f2bc0]-(4)-[UIStackView:0xcca3f2140] (active)>",
"<NSLayoutConstraint:0xcb376b160 'UISV-spacing' V:[UIStackView:0xcca3f2140]-(4)-[UIStackView:0xcca3f0540] (active)>",
"<NSLayoutConstraint:0xcb3769f90 'UISV-spanning-boundary' _UILayoutSpacer:0xcafdbfd00'UISV-alignment-spanner'.top <= UIImageView:0xcca55aa00.top (active)>",
"<NSLayoutConstraint:0xcb376ac10 'UIView-Encapsulated-Layout-Height' UITableViewCellContentView:0xcca3f24c0.height == 40.04 (active)>"
)

Will attempt to recover by breaking constraint
<NSLayoutConstraint:0xcb3768780 UIImageView:0xcca55aa00.height == 30 (active)>

Make a symbolic breakpoint at UIViewAlertForUnsatisfiableConstraints to catch this in the debugger.
The methods in the UIConstraintBasedLayoutDebugging category on UIView listed in <UIKitCore/UIView.h> may also be helpful.
Unable to simultaneously satisfy constraints.
Probably at least one of the constraints in the following list is one you don't want.
Try this:
(1) look at each constraint and try to figure out which you don't expect;
(2) find the code that added the unwanted constraint or constraints and fix it.
(
"<NSLayoutConstraint:0xcb37686e0 UIView:0xcca27d180.height == 0 (active)>",
"<NSLayoutConstraint:0xcb3768cd0 UIView:0xcca27cfc0.height == 0 (active)>",
"<NSLayoutConstraint:0xcb3769e50 UIView:0xcca27ce00.height == 0 (active)>",
"<NSLayoutConstraint:0xcb376a800 UILabel:0xcb36bdc00.height >= 22 (active)>",
"<NSLayoutConstraint:0xcb376b390 UIView:0xcca27e680.height == 0 (active)>",
"<NSLayoutConstraint:0xcb376b570 UIView:0xcca27e300.height == 0 (active)>",
"<NSLayoutConstraint:0xcb376b3e0 UIView:0xcca27e140.height == 0 (active)>",
"<NSLayoutConstraint:0xcb376b610 V:[UIStackView:0xcca3f16c0]-(0)-| (active, names: '|':UITableViewCellContentView:0xcca3f1340 )>",
Unable to simultaneously satisfy constraints.
Probably at least one of the constraints in the following list is one you don't want.
Try this:
(1) look at each constraint and try to figure out which you don't expect;
(2) find the code that added the unwanted constraint or constraints and fix it.
(
"<NSLayoutConstraint:0xcb37686e0 UIView:0xcca27d180.height == 0 (active)>",
"<NSLayoutConstraint:0xcb3768cd0 UIView:0xcca27cfc0.height == 0 (active)>",
"<NSLayoutConstraint:0xcb376b340 UILabel:0xcb36be300.height >= 22 (active)>",
"<NSLayoutConstraint:0xcb376b250 UIView:0xcca27d500.height == 0 (active)>",
"<NSLayoutConstraint:0xcb376b2f0 UIView:0xcca27e840.height == 0 (active)>",
"<NSLayoutConstraint:0xcb376b570 UIView:0xcca27e300.height == 0 (active)>",
"<NSLayoutConstraint:0xcb376b3e0 UIView:0xcca27e140.height == 0 (active)>",
"<NSLayoutConstraint:0xcb376b610 V:[UIStackView:0xcca3f16c0]-(0)-| (active, names: '|':UITableViewCellContentView:0xcca3f1340 )>",
"<NSLayoutConstraint:0xcb376b6b0 V:|-(0)-[UIStackView:0xcca3f16c0] (active, names: '|':UITableViewCellContentView:0xcca3f1340 )>",
"<NSLayoutConstraint:0xcb3790d20 'UISV-alignment' UIButton:0xcca3ab300.centerY == UIStackView:0xcca27d6c0.centerY (active)>",
"<NSLayoutConstraint:0xcb376bac0 'UISV-canvas-connection' UIStackView:0xcca27d340.top == UIView:0xcca27d180.top (active)>",
"<NSLayoutConstraint:0xcb376bb10 'UISV-canvas-connection' V:[UIView:0xcca27cfc0]-(0)-| (active, names: '|':UIStackView:0xcca27d340 )>",
"<NSLayoutConstraint:0xcb3790190 'UISV-canvas-connection' UIStackView:0xcca27d6c0.top == UIView:0xcca27d500.top (active)>",
"<NSLayoutConstraint:0xcb37901e0 'UISV-canvas-connection' V:[UIView:0xcca27e840]-(0)-| (active, names: '|':UIStackView:0xcca27d6c0 )>",
"<NSLayoutConstraint:0xcb3790aa0 'UISV-canvas-connection' V:[_UILayoutSpacer:0xcbe843600'UISV-alignment-spanner']-(0)-| (active, names: '|':UIStackView:0xcca27ddc0 )>",
"<NSLayoutConstraint:0xcb3790af0 'UISV-canvas-connection' UIStackView:0xcca27ddc0.centerY == UIButton:0xcca3ab300.centerY (active)>",
"<NSLayoutConstraint:0xcb3790d70 'UISV-canvas-connection' UIStackView:0xcca27e4c0.top == UIView:0xcca27e300.top (active)>",
"<NSLayoutConstraint:0xcb3790dc0 'UISV-canvas-connection' V:[UIView:0xcca27e140]-(0)-| (active, names: '|':UIStackView:0xcca27e4c0 )>",
"<NSLayoutConstraint:0xcb3790fa0 'UISV-canvas-connection' UIStackView:0xcca3f16c0.top == UIStackView:0xcca27d340.top (active)>",
"<NSLayoutConstraint:0xcb3790ff0 'UISV-canvas-connection' V:[UIStackView:0xcca27e4c0]-(0)-| (active, names: '|':UIStackView:0xcca3f16c0 )>",
"<NSLayoutConstraint:0xcb376bb60 'UISV-spacing' V:[UIView:0xcca27d180]-(5)-[UIView:0xcca27cfc0] (active)>",
"<NSLayoutConstraint:0xcb3790230 'UISV-spacing' V:[UIView:0xcca27d500]-(4)-[UILabel:0xcb36be300] (active)>",
"<NSLayoutConstraint:0xcb3790280 'UISV-spacing' V:[UILabel:0xcb36be300]-(4)-[UIView:0xcca27e840] (active)>",
"<NSLayoutConstraint:0xcb3790e10 'UISV-spacing' V:[UIView:0xcca27e300]-(5)-[UIView:0xcca27e140] (active)>",
"<NSLayoutConstraint:0xcb3791a40 'UISV-spacing' V:[UIStackView:0xcca27d340]-(4)-[UIStackView:0xcca27ddc0] (active)>",
"<NSLayoutConstraint:0xcb3791b30 'UISV-spacing' V:[UIStackView:0xcca27ddc0]-(4)-[UIStackView:0xcca27e4c0] (active)>",
"<NSLayoutConstraint:0xcb3790a00 'UISV-spanning-boundary' _UILayoutSpacer:0xcbe843600'UISV-alignment-spanner'.bottom >= UIStackView:0xcca27d6c0.bottom (active)>",
"<NSLayoutConstraint:0xcb37914f0 'UIView-Encapsulated-Layout-Height' UITableViewCellContentView:0xcca3f1340.height == 40.04 (active)>"
)

Will attempt to recover by breaking constraint
<NSLayoutConstraint:0xcb376b340 UILabel:0xcb36be300.height >= 22 (active)>

Make a symbolic breakpoint at UIViewAlertForUnsatisfiableConstraints to catch this in the debugger.
The methods in the UIConstraintBasedLayoutDebugging category on UIView listed in <UIKitCore/UIView.h> may also be helpful.
Unable to simultaneously satisfy constraints.
Probably at least one of the constraints in the following list is one you don't want.
Try this:
(1) look at each constraint and try to figure out which you don't expect;
(2) find the code that added the unwanted constraint or constraints and fix it.
(
"<NSLayoutConstraint:0xcb37686e0 UIView:0xcca27d180.height == 0 (active)>",
"<NSLayoutConstraint:0xcb3768cd0 UIView:0xcca27cfc0.height == 0 (active)>",
"<NSLayoutConstraint:0xcb376aee0 UIImageView:0xcca22a400.height == 30 (active)>",
"<NSLayoutConstraint:0xcb376b570 UIView:0xcca27e300.height == 0 (active)>",
"<NSLayoutConstraint:0xcb376b3e0 UIView:0xcca27e140.height == 0 (active)>",
"<NSLayoutConstraint:0xcb376b610 V:[UIStackView:0xcca3f16c0]-(0)-| (active, names: '|':UITableViewCellContentView:0xcca3f1340 )>",
"<NSLayoutConstraint:0xcb376b6b0 V:|-(0)-[UIStackView:0xcca3f16c0] (active, names: '|':UITableViewCellContentView:0xcca3f1340 )>",
"<NSLayoutConstraint:0xcb3790c80 'UISV-alignment' UIButton:0xcca3ab300.centerY == UIImageView:0xcca22a400.centerY (active)>",
"<NSLayoutConstraint:0xcb376bac0 'UISV-canvas-connection' UIStackView:0xcca27d340.top == UIView:0xcca27d180.top (active)>",
"<NSLayoutConstraint:0xcb376bb10 'UISV-canvas-connection' V:[UIView:0xcca27cfc0]-(0)-| (active, names: '|':UIStackView:0xcca27d340 )>",
"<NSLayoutConstraint:0xcb3790a50 'UISV-canvas-connection' UIStackView:0xcca27ddc0.top == _UILayoutSpacer:0xcbe843600'UISV-alignment-spanner'.top (active)>",
"<NSLayoutConstraint:0xcb3790af0 'UISV-canvas-connection' UIStackView:0xcca27ddc0.centerY == UIButton:0xcca3ab300.centerY (active)>",
"<NSLayoutConstraint:0xcb3790d70 'UISV-canvas-connection' UIStackView:0xcca27e4c0.top == UIView:0xcca27e300.top (active)>",
"<NSLayoutConstraint:0xcb3790dc0 'UISV-canvas-connection' V:[UIView:0xcca27e140]-(0)-| (active, names: '|':UIStackView:0xcca27e4c0 )>",
"<NSLayoutConstraint:0xcb3790fa0 'UISV-canvas-connection' UIStackView:0xcca3f16c0.top == UIStackView:0xcca27d340.top (active)>",
"<NSLayoutConstraint:0xcb3790ff0 'UISV-canvas-connection' V:[UIStackView:0xcca27e4c0]-(0)-| (active, names: '|':UIStackView:0xcca3f16c0 )>",
"<NSLayoutConstraint:0xcb376bb60 'UISV-spacing' V:[UIView:0xcca27d180]-(5)-[UIView:0xcca27cfc0] (active)>",
"<NSLayoutConstraint:0xcb3790e10 'UISV-spacing' V:[UIView:0xcca27e300]-(5)-[UIView:0xcca27e140] (active)>",
"<NSLayoutConstraint:0xcb3791a40 'UISV-spacing' V:[UIStackView:0xcca27d340]-(4)-[UIStackView:0xcca27ddc0] (active)>",
"<NSLayoutConstraint:0xcb3791b30 'UISV-spacing' V:[UIStackView:0xcca27ddc0]-(4)-[UIStackView:0xcca27e4c0] (active)>",
"<NSLayoutConstraint:0xcb3790870 'UISV-spanning-boundary' _UILayoutSpacer:0xcbe843600'UISV-alignment-spanner'.top <= UIImageView:0xcca22a400.top (active)>",
"<NSLayoutConstraint:0xcb37914f0 'UIView-Encapsulated-Layout-Height' UITableViewCellContentView:0xcca3f1340.height == 40.04 (active)>"
)

Will attempt to recover by breaking constraint
<NSLayoutConstraint:0xcb376aee0 UIImageView:0xcca22a400.height == 30 (active)>

Make a symbolic breakpoint at UIViewAlertForUnsatisfiableConstraints to catch this in the debugger.
The methods in the UIConstraintBasedLayoutDebugging category on UIView listed in <UIKitCore/UIView.h> may also be helpful.
Unable to simultaneously satisfy constraints.
Probably at least one of the constraints in the following list is one you don't want.
Try this:
(1) look at each constraint and try to figure out which you don't expect;
(2) find the code that added the unwanted constraint or constraints and fix it.
(
"<NSLayoutConstraint:0xcb3790730 UIView:0xcca27f480.height == 0 (active)>",
"<NSLayoutConstraint:0xcb3791680 UIView:0xcca288540.height == 0 (active)>",
"<NSLayoutConstraint:0xcb3791630 UIView:0xcca288380.height == 0 (active)>",
"<NSLayoutConstraint:0xcb37910e0 UILabel:0xcb36be680.height >= 22 (active)>",
"<NSLayoutConstraint:0xcb3791d60 UIView:0xcca26d880.height == 0 (active)>",
"<NSLayoutConstraint:0xcb3791db0 UIView:0xcca26ea00.height == 0 (active)>",
"<NSLayoutConstraint:0xcb3791e00 UIView:0xcca26e840.height == 0 (active)>",
"<NSLayoutConstraint:0xcb3791fe0 V:[UIStackView:0xcca27f800]-(0)-| (active, names: '|':UITableViewCellContentView:0xcca27fd40 )>",
Unable to simultaneously satisfy constraints.
Probably at least one of the constraints in the following list is one you don't want.
Try this:
(1) look at each constraint and try to figure out which you don't expect;
(2) find the code that added the unwanted constraint or constraints and fix it.
(
"<NSLayoutConstraint:0xcb3790730 UIView:0xcca27f480.height == 0 (active)>",
"<NSLayoutConstraint:0xcb3791680 UIView:0xcca288540.height == 0 (active)>",
"<NSLayoutConstraint:0xcb3791860 UIImageView:0xcca22bc00.height == 30 (active)>",
"<NSLayoutConstraint:0xcb3791db0 UIView:0xcca26ea00.height == 0 (active)>",
"<NSLayoutConstraint:0xcb3791e00 UIView:0xcca26e840.height == 0 (active)>",
"<NSLayoutConstraint:0xcb3791fe0 V:[UIStackView:0xcca27f800]-(0)-| (active, names: '|':UITableViewCellContentView:0xcca27fd40 )>",
"<NSLayoutConstraint:0xcb3792030 V:|-(0)-[UIStackView:0xcca27f800] (active, names: '|':UITableViewCellContentView:0xcca27fd40 )>",
"<NSLayoutConstraint:0xcb37935c0 'UISV-alignment' UIButton:0xcca28f000.centerY == UIImageView:0xcca22bc00.centerY (active)>",
"<NSLayoutConstraint:0xcb3792440 'UISV-canvas-connection' UIStackView:0xcca27f640.top == UIView:0xcca27f480.top (active)>",
"<NSLayoutConstraint:0xcb3792490 'UISV-canvas-connection' V:[UIView:0xcca288540]-(0)-| (active, names: '|':UIStackView:0xcca27f640 )>",
"<NSLayoutConstraint:0xcb3793390 'UISV-canvas-connection' UIStackView:0xcca2881c0.top == _UILayoutSpacer:0xcbbce0400'UISV-alignment-spanner'.top (active)>",
"<NSLayoutConstraint:0xcb3793430 'UISV-canvas-connection' UIStackView:0xcca2881c0.centerY == UIButton:0xcca28f000.centerY (active)>",
"<NSLayoutConstraint:0xcb37936b0 'UISV-canvas-connection' UIStackView:0xcca26ebc0.top == UIView:0xcca26ea00.top (active)>",
"<NSLayoutConstraint:0xcb3793700 'UISV-canvas-connection' V:[UIView:0xcca26e840]-(0)-| (active, names: '|':UIStackView:0xcca26ebc0 )>",
"<NSLayoutConstraint:0xcb37938e0 'UISV-canvas-connection' UIStackView:0xcca27f800.top == UIStackView:0xcca27f640.top (active)>",
"<NSLayoutConstraint:0xcb3793930 'UISV-canvas-connection' V:[UIStackView:0xcca26ebc0]-(0)-| (active, names: '|':UIStackView:0xcca27f800 )>",
"<NSLayoutConstraint:0xcb37924e0 'UISV-spacing' V:[UIView:0xcca27f480]-(5)-[UIView:0xcca288540] (active)>",
"<NSLayoutConstraint:0xcb3793750 'UISV-spacing' V:[UIView:0xcca26ea00]-(5)-[UIView:0xcca26e840] (active)>",
"<NSLayoutConstraint:0xcb37a82d0 'UISV-spacing' V:[UIStackView:0xcca27f640]-(4)-[UIStackView:0xcca2881c0] (active)>",
"<NSLayoutConstraint:0xcb37a83c0 'UISV-spacing' V:[UIStackView:0xcca2881c0]-(4)-[UIStackView:0xcca26ebc0] (active)>",
"<NSLayoutConstraint:0xcb37931b0 'UISV-spanning-boundary' _UILayoutSpacer:0xcbbce0400'UISV-alignment-spanner'.top <= UIImageView:0xcca22bc00.top (active)>",
"<NSLayoutConstraint:0xcb3793e30 'UIView-Encapsulated-Layout-Height' UITableViewCellContentView:0xcca27fd40.height == 40.04 (active)>"
)

Will attempt to recover by breaking constraint
<NSLayoutConstraint:0xcb3791860 UIImageView:0xcca22bc00.height == 30 (active)>

Make a symbolic breakpoint at UIViewAlertForUnsatisfiableConstraints to catch this in the debugger.
The methods in the UIConstraintBasedLayoutDebugging category on UIView listed in <UIKitCore/UIView.h> may also be helpful.
Unable to simultaneously satisfy constraints.
Probably at least one of the constraints in the following list is one you don't want.
Try this:
(1) look at each constraint and try to figure out which you don't expect;
(2) find the code that added the unwanted constraint or constraints and fix it.
(
"<NSLayoutConstraint:0xcb3790730 UIView:0xcca27f480.height == 0 (active)>",
"<NSLayoutConstraint:0xcb3791680 UIView:0xcca288540.height == 0 (active)>",
"<NSLayoutConstraint:0xcb3791cc0 UIView:0xcca26dc00.height == 0 (active)>",
"<NSLayoutConstraint:0xcb3791b80 UILabel:0xcb36bed80.height >= 22 (active)>",
"<NSLayoutConstraint:0xcb3791c70 UIView:0xcca26da40.height == 0 (active)>",
"<NSLayoutConstraint:0xcb3791db0 UIView:0xcca26ea00.height == 0 (active)>",
"<NSLayoutConstraint:0xcb3791e00 UIView:0xcca26e840.height == 0 (active)>",
"<NSLayoutConstraint:0xcb3791fe0 V:[UIStackView:0xcca27f800]-(0)-| (active, names: '|':UITableViewCellContentView:0xcca27fd40 )>",
"<NSLayoutConstraint:0xcb3792030 V:|-(0)-[UIStackView:0xcca27f800] (active, names: '|':UITableViewCellContentView:0xcca27fd40 )>",
"<NSLayoutConstraint:0xcb3793660 'UISV-alignment' UIButton:0xcca28f000.centerY == UIStackView:0xcca26ddc0.centerY (active)>",
"<NSLayoutConstraint:0xcb3792440 'UISV-canvas-connection' UIStackView:0xcca27f640.top == UIView:0xcca27f480.top (active)>",
"<NSLayoutConstraint:0xcb3792490 'UISV-canvas-connection' V:[UIView:0xcca288540]-(0)-| (active, names: '|':UIStackView:0xcca27f640 )>",
"<NSLayoutConstraint:0xcb3792ad0 'UISV-canvas-connection' UIStackView:0xcca26ddc0.top == UIView:0xcca26dc00.top (active)>",
"<NSLayoutConstraint:0xcb3792b20 'UISV-canvas-connection' V:[UIView:0xcca26da40]-(0)-| (active, names: '|':UIStackView:0xcca26ddc0 )>",
"<NSLayoutConstraint:0xcb37933e0 'UISV-canvas-connection' V:[_UILayoutSpacer:0xcbbce0400'UISV-alignment-spanner']-(0)-| (active, names: '|':UIStackView:0xcca2881c0 )>",
"<NSLayoutConstraint:0xcb3793430 'UISV-canvas-connection' UIStackView:0xcca2881c0.centerY == UIButton:0xcca28f000.centerY (active)>",
"<NSLayoutConstraint:0xcb37936b0 'UISV-canvas-connection' UIStackView:0xcca26ebc0.top == UIView:0xcca26ea00.top (active)>",
"<NSLayoutConstraint:0xcb3793700 'UISV-canvas-connection' V:[UIView:0xcca26e840]-(0)-| (active, names: '|':UIStackView:0xcca26ebc0 )>",
"<NSLayoutConstraint:0xcb37938e0 'UISV-canvas-connection' UIStackView:0xcca27f800.top == UIStackView:0xcca27f640.top (active)>",
"<NSLayoutConstraint:0xcb3793930 'UISV-canvas-connection' V:[UIStackView:0xcca26ebc0]-(0)-| (active, names: '|':UIStackView:0xcca27f800 )>",
"<NSLayoutConstraint:0xcb37924e0 'UISV-spacing' V:[UIView:0xcca27f480]-(5)-[UIView:0xcca288540] (active)>",
"<NSLayoutConstraint:0xcb3792b70 'UISV-spacing' V:[UIView:0xcca26dc00]-(4)-[UILabel:0xcb36bed80] (active)>",
"<NSLayoutConstraint:0xcb3792bc0 'UISV-spacing' V:[UILabel:0xcb36bed80]-(4)-[UIView:0xcca26da40] (active)>",
"<NSLayoutConstraint:0xcb3793750 'UISV-spacing' V:[UIView:0xcca26ea00]-(5)-[UIView:0xcca26e840] (active)>",
"<NSLayoutConstraint:0xcb37a82d0 'UISV-spacing' V:[UIStackView:0xcca27f640]-(4)-[UIStackView:0xcca2881c0] (active)>",
"<NSLayoutConstraint:0xcb37a83c0 'UISV-spacing' V:[UIStackView:0xcca2881c0]-(4)-[UIStackView:0xcca26ebc0] (active)>",
"<NSLayoutConstraint:0xcb3793340 'UISV-spanning-boundary' _UILayoutSpacer:0xcbbce0400'UISV-alignment-spanner'.bottom >= UIStackView:0xcca26ddc0.bottom (active)>",
"<NSLayoutConstraint:0xcb3793e30 'UIView-Encapsulated-Layout-Height' UITableViewCellContentView:0xcca27fd40.height == 40.04 (active)>"
)

Will attempt to recover by breaking constraint
<NSLayoutConstraint:0xcb3791b80 UILabel:0xcb36bed80.height >= 22 (active)>

Make a symbolic breakpoint at UIViewAlertForUnsatisfiableConstraints to catch this in the debugger.
The methods in the UIConstraintBasedLayoutDebugging category on UIView listed in <UIKitCore/UIView.h> may also be helpful.
Unable to simultaneously satisfy constraints.
Probably at least one of the constraints in the following list is one you don't want.
Try this:
(1) look at each constraint and try to figure out which you don't expect;
(2) find the code that added the unwanted constraint or constraints and fix it.
(
"<NSLayoutConstraint:0xcb37a8000 UIView:0xcca436d80.height == 0 (active)>",
"<NSLayoutConstraint:0xcb37a8050 UIView:0xcca4372c0.height == 0 (active)>",
"<NSLayoutConstraint:0xcb37a80a0 UIView:0xcca436f40.height == 0 (active)>",
"<NSLayoutConstraint:0xcb37a85f0 UILabel:0xcb36bf100.height >= 22 (active)>",
"<NSLayoutConstraint:0xcb37a88c0 UIView:0xcca435500.height == 0 (active)>",
"<NSLayoutConstraint:0xcb37a8910 UIView:0xcca435a40.height == 0 (active)>",
"<NSLayoutConstraint:0xcb37a8960 UIView:0xcca4356c0.height == 0 (active)>",
"<NSLayoutConstraint:0xcb37a8b40 V:[UIStackView:0xcca436300]-(0)-| (active, names: '|':UITableViewCellContentView:0xcca436140 )>",
Unable to simultaneously satisfy constraints.
Probably at least one of the constraints in the following list is one you don't want.
Try this:
(1) look at each constraint and try to figure out which you don't expect;
(2) find the code that added the unwanted constraint or constraints and fix it.
(
"<NSLayoutConstraint:0xcb37a8000 UIView:0xcca436d80.height == 0 (active)>",
"<NSLayoutConstraint:0xcb37a8050 UIView:0xcca4372c0.height == 0 (active)>",
"<NSLayoutConstraint:0xcb37a87d0 UILabel:0xcb36bf800.height >= 22 (active)>",
"<NSLayoutConstraint:0xcb37a8730 UIView:0xcca434a80.height == 0 (active)>",
"<NSLayoutConstraint:0xcb37a8870 UIView:0xcca434c40.height == 0 (active)>",
"<NSLayoutConstraint:0xcb37a8910 UIView:0xcca435a40.height == 0 (active)>",
"<NSLayoutConstraint:0xcb37a8960 UIView:0xcca4356c0.height == 0 (active)>",
"<NSLayoutConstraint:0xcb37a8b40 V:[UIStackView:0xcca436300]-(0)-| (active, names: '|':UITableViewCellContentView:0xcca436140 )>",
"<NSLayoutConstraint:0xcb37a8b90 V:|-(0)-[UIStackView:0xcca436300] (active, names: '|':UITableViewCellContentView:0xcca436140 )>",
"<NSLayoutConstraint:0xcb37aa1c0 'UISV-alignment' UIButton:0xcca28ed00.centerY == UIStackView:0xcca4364c0.centerY (active)>",
"<NSLayoutConstraint:0xcb37a8fa0 'UISV-canvas-connection' UIStackView:0xcca436bc0.top == UIView:0xcca436d80.top (active)>",
"<NSLayoutConstraint:0xcb37a8ff0 'UISV-canvas-connection' V:[UIView:0xcca4372c0]-(0)-| (active, names: '|':UIStackView:0xcca436bc0 )>",
"<NSLayoutConstraint:0xcb37a9630 'UISV-canvas-connection' UIStackView:0xcca4364c0.top == UIView:0xcca434a80.top (active)>",
"<NSLayoutConstraint:0xcb37a9680 'UISV-canvas-connection' V:[UIView:0xcca434c40]-(0)-| (active, names: '|':UIStackView:0xcca4364c0 )>",
"<NSLayoutConstraint:0xcb37a9f40 'UISV-canvas-connection' V:[_UILayoutSpacer:0xcb3433c00'UISV-alignment-spanner']-(0)-| (active, names: '|':UIStackView:0xcca437100 )>",
"<NSLayoutConstraint:0xcb37a9f90 'UISV-canvas-connection' UIStackView:0xcca437100.centerY == UIButton:0xcca28ed00.centerY (active)>",
"<NSLayoutConstraint:0xcb37aa210 'UISV-canvas-connection' UIStackView:0xcca435880.top == UIView:0xcca435a40.top (active)>",
"<NSLayoutConstraint:0xcb37aa260 'UISV-canvas-connection' V:[UIView:0xcca4356c0]-(0)-| (active, names: '|':UIStackView:0xcca435880 )>",
"<NSLayoutConstraint:0xcb37aa440 'UISV-canvas-connection' UIStackView:0xcca436300.top == UIStackView:0xcca436bc0.top (active)>",
"<NSLayoutConstraint:0xcb37aa490 'UISV-canvas-connection' V:[UIStackView:0xcca435880]-(0)-| (active, names: '|':UIStackView:0xcca436300 )>",
"<NSLayoutConstraint:0xcb37a9040 'UISV-spacing' V:[UIView:0xcca436d80]-(5)-[UIView:0xcca4372c0] (active)>",
"<NSLayoutConstraint:0xcb37a96d0 'UISV-spacing' V:[UIView:0xcca434a80]-(4)-[UILabel:0xcb36bf800] (active)>",
"<NSLayoutConstraint:0xcb37a9720 'UISV-spacing' V:[UILabel:0xcb36bf800]-(4)-[UIView:0xcca434c40] (active)>",
"<NSLayoutConstraint:0xcb37aa2b0 'UISV-spacing' V:[UIView:0xcca435a40]-(5)-[UIView:0xcca4356c0] (active)>",
"<NSLayoutConstraint:0xcb37aadf0 'UISV-spacing' V:[UIStackView:0xcca436bc0]-(4)-[UIStackView:0xcca437100] (active)>",
"<NSLayoutConstraint:0xcb37aaee0 'UISV-spacing' V:[UIStackView:0xcca437100]-(4)-[UIStackView:0xcca435880] (active)>",
"<NSLayoutConstraint:0xcb37a9ea0 'UISV-spanning-boundary' _UILayoutSpacer:0xcb3433c00'UISV-alignment-spanner'.bottom >= UIStackView:0xcca4364c0.bottom (active)>",
"<NSLayoutConstraint:0xcb37aa990 'UIView-Encapsulated-Layout-Height' UITableViewCellContentView:0xcca436140.height == 40.04 (active)>"
)

Will attempt to recover by breaking constraint
<NSLayoutConstraint:0xcb37a87d0 UILabel:0xcb36bf800.height >= 22 (active)>

Make a symbolic breakpoint at UIViewAlertForUnsatisfiableConstraints to catch this in the debugger.
The methods in the UIConstraintBasedLayoutDebugging category on UIView listed in <UIKitCore/UIView.h> may also be helpful.
Unable to simultaneously satisfy constraints.
Probably at least one of the constraints in the following list is one you don't want.
Try this:
(1) look at each constraint and try to figure out which you don't expect;
(2) find the code that added the unwanted constraint or constraints and fix it.
(
"<NSLayoutConstraint:0xcb37a8000 UIView:0xcca436d80.height == 0 (active)>",
"<NSLayoutConstraint:0xcb37a8050 UIView:0xcca4372c0.height == 0 (active)>",
"<NSLayoutConstraint:0xcb37a8410 UIImageView:0xcca22b800.height == 30 (active)>",
"<NSLayoutConstraint:0xcb37a8910 UIView:0xcca435a40.height == 0 (active)>",
"<NSLayoutConstraint:0xcb37a8960 UIView:0xcca4356c0.height == 0 (active)>",
"<NSLayoutConstraint:0xcb37a8b40 V:[UIStackView:0xcca436300]-(0)-| (active, names: '|':UITableViewCellContentView:0xcca436140 )>",
"<NSLayoutConstraint:0xcb37a8b90 V:|-(0)-[UIStackView:0xcca436300] (active, names: '|':UITableViewCellContentView:0xcca436140 )>",
"<NSLayoutConstraint:0xcb37aa120 'UISV-alignment' UIButton:0xcca28ed00.centerY == UIImageView:0xcca22b800.centerY (active)>",
"<NSLayoutConstraint:0xcb37a8fa0 'UISV-canvas-connection' UIStackView:0xcca436bc0.top == UIView:0xcca436d80.top (active)>",
"<NSLayoutConstraint:0xcb37a8ff0 'UISV-canvas-connection' V:[UIView:0xcca4372c0]-(0)-| (active, names: '|':UIStackView:0xcca436bc0 )>",
"<NSLayoutConstraint:0xcb37a9ef0 'UISV-canvas-connection' UIStackView:0xcca437100.top == _UILayoutSpacer:0xcb3433c00'UISV-alignment-spanner'.top (active)>",
"<NSLayoutConstraint:0xcb37a9f90 'UISV-canvas-connection' UIStackView:0xcca437100.centerY == UIButton:0xcca28ed00.centerY (active)>",
"<NSLayoutConstraint:0xcb37aa210 'UISV-canvas-connection' UIStackView:0xcca435880.top == UIView:0xcca435a40.top (active)>",
"<NSLayoutConstraint:0xcb37aa260 'UISV-canvas-connection' V:[UIView:0xcca4356c0]-(0)-| (active, names: '|':UIStackView:0xcca435880 )>",
"<NSLayoutConstraint:0xcb37aa440 'UISV-canvas-connection' UIStackView:0xcca436300.top == UIStackView:0xcca436bc0.top (active)>",
"<NSLayoutConstraint:0xcb37aa490 'UISV-canvas-connection' V:[UIStackView:0xcca435880]-(0)-| (active, names: '|':UIStackView:0xcca436300 )>",
"<NSLayoutConstraint:0xcb37a9040 'UISV-spacing' V:[UIView:0xcca436d80]-(5)-[UIView:0xcca4372c0] (active)>",
"<NSLayoutConstraint:0xcb37aa2b0 'UISV-spacing' V:[UIView:0xcca435a40]-(5)-[UIView:0xcca4356c0] (active)>",
"<NSLayoutConstraint:0xcb37aadf0 'UISV-spacing' V:[UIStackView:0xcca436bc0]-(4)-[UIStackView:0xcca437100] (active)>",
"<NSLayoutConstraint:0xcb37aaee0 'UISV-spacing' V:[UIStackView:0xcca437100]-(4)-[UIStackView:0xcca435880] (active)>",
"<NSLayoutConstraint:0xcb37a9d10 'UISV-spanning-boundary' _UILayoutSpacer:0xcb3433c00'UISV-alignment-spanner'.top <= UIImageView:0xcca22b800.top (active)>",
"<NSLayoutConstraint:0xcb37aa990 'UIView-Encapsulated-Layout-Height' UITableViewCellContentView:0xcca436140.height == 40.04 (active)>"
)

Will attempt to recover by breaking constraint
<NSLayoutConstraint:0xcb37a8410 UIImageView:0xcca22b800.height == 30 (active)>

Make a symbolic breakpoint at UIViewAlertForUnsatisfiableConstraints to catch this in the debugger.
The methods in the UIConstraintBasedLayoutDebugging category on UIView listed in <UIKitCore/UIView.h> may also be helpful.
Unable to simultaneously satisfy constraints.
Probably at least one of the constraints in the following list is one you don't want.
Try this:
(1) look at each constraint and try to figure out which you don't expect;
(2) find the code that added the unwanted constraint or constraints and fix it.
(
"<NSLayoutConstraint:0xcb37a8550 UIView:0xcca4341c0.height == 0 (active)>",
"<NSLayoutConstraint:0xcb37a8a50 UIView:0xcca4348c0.height == 0 (active)>",
"<NSLayoutConstraint:0xcb37a9bd0 UIView:0xcca434700.height == 0 (active)>",
"<NSLayoutConstraint:0xcb37aa580 UILabel:0xcb36bfb80.height >= 22 (active)>",
"<NSLayoutConstraint:0xcb37ab110 UIView:0xcca2f8000.height == 0 (active)>",
"<NSLayoutConstraint:0xcb37ab160 UIView:0xcca2f8380.height == 0 (active)>",
"<NSLayoutConstraint:0xcb37ab1b0 UIView:0xcca2f8540.height == 0 (active)>",
"<NSLayoutConstraint:0xcb37ab390 V:[UIStackView:0xcca434e00]-(0)-| (active, names: '|':UITableViewCellContentView:0xcca434fc0 )>",
Unable to simultaneously satisfy constraints.
Probably at least one of the constraints in the following list is one you don't want.
Try this:
(1) look at each constraint and try to figure out which you don't expect;
(2) find the code that added the unwanted constraint or constraints and fix it.
(
"<NSLayoutConstraint:0xcb37a8550 UIView:0xcca4341c0.height == 0 (active)>",
"<NSLayoutConstraint:0xcb37a8a50 UIView:0xcca4348c0.height == 0 (active)>",
"<NSLayoutConstraint:0xcb37aaf30 UILabel:0xcb3760380.height >= 22 (active)>",
"<NSLayoutConstraint:0xcb37ab070 UIView:0xcca4379c0.height == 0 (active)>",
"<NSLayoutConstraint:0xcb37ab020 UIView:0xcca26e4c0.height == 0 (active)>",
"<NSLayoutConstraint:0xcb37ab160 UIView:0xcca2f8380.height == 0 (active)>",
"<NSLayoutConstraint:0xcb37ab1b0 UIView:0xcca2f8540.height == 0 (active)>",
"<NSLayoutConstraint:0xcb37ab390 V:[UIStackView:0xcca434e00]-(0)-| (active, names: '|':UITableViewCellContentView:0xcca434fc0 )>",
"<NSLayoutConstraint:0xcb37ab3e0 V:|-(0)-[UIStackView:0xcca434e00] (active, names: '|':UITableViewCellContentView:0xcca434fc0 )>",
"<NSLayoutConstraint:0xcb37cc690 'UISV-alignment' UIButton:0xcca28f600.centerY == UIStackView:0xcca437800.centerY (active)>",
"<NSLayoutConstraint:0xcb37ab7f0 'UISV-canvas-connection' UIStackView:0xcca434000.top == UIView:0xcca4341c0.top (active)>",
"<NSLayoutConstraint:0xcb37ab840 'UISV-canvas-connection' V:[UIView:0xcca4348c0]-(0)-| (active, names: '|':UIStackView:0xcca434000 )>",
"<NSLayoutConstraint:0xcb37abe80 'UISV-canvas-connection' UIStackView:0xcca437800.top == UIView:0xcca4379c0.top (active)>",
"<NSLayoutConstraint:0xcb37abed0 'UISV-canvas-connection' V:[UIView:0xcca26e4c0]-(0)-| (active, names: '|':UIStackView:0xcca437800 )>",
"<NSLayoutConstraint:0xcb37cc410 'UISV-canvas-connection' V:[_UILayoutSpacer:0xcb3432b00'UISV-alignment-spanner']-(0)-| (active, names: '|':UIStackView:0xcca437480 )>",
"<NSLayoutConstraint:0xcb37cc460 'UISV-canvas-connection' UIStackView:0xcca437480.centerY == UIButton:0xcca28f600.centerY (active)>",
"<NSLayoutConstraint:0xcb37cc6e0 'UISV-canvas-connection' UIStackView:0xcca2f81c0.top == UIView:0xcca2f8380.top (active)>",
"<NSLayoutConstraint:0xcb37cc730 'UISV-canvas-connection' V:[UIView:0xcca2f8540]-(0)-| (active, names: '|':UIStackView:0xcca2f81c0 )>",
"<NSLayoutConstraint:0xcb37cc910 'UISV-canvas-connection' UIStackView:0xcca434e00.top == UIStackView:0xcca434000.top (active)>",
"<NSLayoutConstraint:0xcb37cc960 'UISV-canvas-connection' V:[UIStackView:0xcca2f81c0]-(0)-| (active, names: '|':UIStackView:0xcca434e00 )>",
"<NSLayoutConstraint:0xcb37ab890 'UISV-spacing' V:[UIView:0xcca4341c0]-(5)-[UIView:0xcca4348c0] (active)>",
"<NSLayoutConstraint:0xcb37abf20 'UISV-spacing' V:[UIView:0xcca4379c0]-(4)-[UILabel:0xcb3760380] (active)>",
"<NSLayoutConstraint:0xcb37abf70 'UISV-spacing' V:[UILabel:0xcb3760380]-(4)-[UIView:0xcca26e4c0] (active)>",
"<NSLayoutConstraint:0xcb37cc780 'UISV-spacing' V:[UIView:0xcca2f8380]-(5)-[UIView:0xcca2f8540] (active)>",
"<NSLayoutConstraint:0xcb37cd310 'UISV-spacing' V:[UIStackView:0xcca434000]-(4)-[UIStackView:0xcca437480] (active)>",
"<NSLayoutConstraint:0xcb37cd400 'UISV-spacing' V:[UIStackView:0xcca437480]-(4)-[UIStackView:0xcca2f81c0] (active)>",
"<NSLayoutConstraint:0xcb37cc370 'UISV-spanning-boundary' _UILayoutSpacer:0xcb3432b00'UISV-alignment-spanner'.bottom >= UIStackView:0xcca437800.bottom (active)>",
"<NSLayoutConstraint:0xcb37cce60 'UIView-Encapsulated-Layout-Height' UITableViewCellContentView:0xcca434fc0.height == 40.04 (active)>"
)

Will attempt to recover by breaking constraint
<NSLayoutConstraint:0xcb37aaf30 UILabel:0xcb3760380.height >= 22 (active)>

Make a symbolic breakpoint at UIViewAlertForUnsatisfiableConstraints to catch this in the debugger.
The methods in the UIConstraintBasedLayoutDebugging category on UIView listed in <UIKitCore/UIView.h> may also be helpful.
Unable to simultaneously satisfy constraints.
Probably at least one of the constraints in the following list is one you don't want.
Try this:
(1) look at each constraint and try to figure out which you don't expect;
(2) find the code that added the unwanted constraint or constraints and fix it.
(
"<NSLayoutConstraint:0xcb37a8550 UIView:0xcca4341c0.height == 0 (active)>",
"<NSLayoutConstraint:0xcb37a8a50 UIView:0xcca4348c0.height == 0 (active)>",
"<NSLayoutConstraint:0xcb37aac60 UIImageView:0xcca300a00.height == 30 (active)>",
"<NSLayoutConstraint:0xcb37ab160 UIView:0xcca2f8380.height == 0 (active)>",
"<NSLayoutConstraint:0xcb37ab1b0 UIView:0xcca2f8540.height == 0 (active)>",
"<NSLayoutConstraint:0xcb37ab390 V:[UIStackView:0xcca434e00]-(0)-| (active, names: '|':UITableViewCellContentView:0xcca434fc0 )>",
"<NSLayoutConstraint:0xcb37ab3e0 V:|-(0)-[UIStackView:0xcca434e00] (active, names: '|':UITableViewCellContentView:0xcca434fc0 )>",
"<NSLayoutConstraint:0xcb37cc5f0 'UISV-alignment' UIButton:0xcca28f600.centerY == UIImageView:0xcca300a00.centerY (active)>",
"<NSLayoutConstraint:0xcb37ab7f0 'UISV-canvas-connection' UIStackView:0xcca434000.top == UIView:0xcca4341c0.top (active)>",
"<NSLayoutConstraint:0xcb37ab840 'UISV-canvas-connection' V:[UIView:0xcca4348c0]-(0)-| (active, names: '|':UIStackView:0xcca434000 )>",
"<NSLayoutConstraint:0xcb37cc3c0 'UISV-canvas-connection' UIStackView:0xcca437480.top == _UILayoutSpacer:0xcb3432b00'UISV-alignment-spanner'.top (active)>",
"<NSLayoutConstraint:0xcb37cc460 'UISV-canvas-connection' UIStackView:0xcca437480.centerY == UIButton:0xcca28f600.centerY (active)>",
"<NSLayoutConstraint:0xcb37cc6e0 'UISV-canvas-connection' UIStackView:0xcca2f81c0.top == UIView:0xcca2f8380.top (active)>",
"<NSLayoutConstraint:0xcb37cc730 'UISV-canvas-connection' V:[UIView:0xcca2f8540]-(0)-| (active, names: '|':UIStackView:0xcca2f81c0 )>",
"<NSLayoutConstraint:0xcb37cc910 'UISV-canvas-connection' UIStackView:0xcca434e00.top == UIStackView:0xcca434000.top (active)>",
"<NSLayoutConstraint:0xcb37cc960 'UISV-canvas-connection' V:[UIStackView:0xcca2f81c0]-(0)-| (active, names: '|':UIStackView:0xcca434e00 )>",
"<NSLayoutConstraint:0xcb37ab890 'UISV-spacing' V:[UIView:0xcca4341c0]-(5)-[UIView:0xcca4348c0] (active)>",
"<NSLayoutConstraint:0xcb37cc780 'UISV-spacing' V:[UIView:0xcca2f8380]-(5)-[UIView:0xcca2f8540] (active)>",
"<NSLayoutConstraint:0xcb37cd310 'UISV-spacing' V:[UIStackView:0xcca434000]-(4)-[UIStackView:0xcca437480] (active)>",
"<NSLayoutConstraint:0xcb37cd400 'UISV-spacing' V:[UIStackView:0xcca437480]-(4)-[UIStackView:0xcca2f81c0] (active)>",
"<NSLayoutConstraint:0xcb37cc1e0 'UISV-spanning-boundary' _UILayoutSpacer:0xcb3432b00'UISV-alignment-spanner'.top <= UIImageView:0xcca300a00.top (active)>",
"<NSLayoutConstraint:0xcb37cce60 'UIView-Encapsulated-Layout-Height' UITableViewCellContentView:0xcca434fc0.height == 40.04 (active)>"
)

Will attempt to recover by breaking constraint
<NSLayoutConstraint:0xcb37aac60 UIImageView:0xcca300a00.height == 30 (active)>

Make a symbolic breakpoint at UIViewAlertForUnsatisfiableConstraints to catch this in the debugger.
The methods in the UIConstraintBasedLayoutDebugging category on UIView listed in <UIKitCore/UIView.h> may also be helpful.
Unable to simultaneously satisfy constraints.
Probably at least one of the constraints in the following list is one you don't want.
Try this:
(1) look at each constraint and try to figure out which you don't expect;
(2) find the code that added the unwanted constraint or constraints and fix it.
(
"<NSLayoutConstraint:0xcb37cdf40 UIView:0xcca308e00.height == 0 (active)>",
"<NSLayoutConstraint:0xcb37ce990 UIView:0xcca308fc0.height == 0 (active)>",
"<NSLayoutConstraint:0xcb37cf700 UIView:0xcca309180.height == 0 (active)>",
"<NSLayoutConstraint:0xcb37cfa20 UILabel:0xcb3760e00.height >= 22 (active)>",
"<NSLayoutConstraint:0xcb37cfcf0 UIView:0xcca309f80.height == 0 (active)>",
"<NSLayoutConstraint:0xcb37cfd40 UIView:0xcca30a300.height == 0 (active)>",
"<NSLayoutConstraint:0xcb37cfd90 UIView:0xcca30a4c0.height == 0 (active)>",
"<NSLayoutConstraint:0xcb37cff70 V:[UIStackView:0xcca308a80]-(0)-| (active, names: '|':UITableViewCellContentView:0xcca3088c0 )>",
Unable to simultaneously satisfy constraints.
Probably at least one of the constraints in the following list is one you don't want.
Try this:
(1) look at each constraint and try to figure out which you don't expect;
(2) find the code that added the unwanted constraint or constraints and fix it.
(
"<NSLayoutConstraint:0xcb37cdf40 UIView:0xcca308e00.height == 0 (active)>",
"<NSLayoutConstraint:0xcb37ce990 UIView:0xcca308fc0.height == 0 (active)>",
"<NSLayoutConstraint:0xcb37cf930 UIImageView:0xcca301a00.height == 30 (active)>",
"<NSLayoutConstraint:0xcb37cfd40 UIView:0xcca30a300.height == 0 (active)>",
"<NSLayoutConstraint:0xcb37cfd90 UIView:0xcca30a4c0.height == 0 (active)>",
"<NSLayoutConstraint:0xcb37cff70 V:[UIStackView:0xcca308a80]-(0)-| (active, names: '|':UITableViewCellContentView:0xcca3088c0 )>",
"<NSLayoutConstraint:0xcb37abcf0 V:|-(0)-[UIStackView:0xcca308a80] (active, names: '|':UITableViewCellContentView:0xcca3088c0 )>",
"<NSLayoutConstraint:0xcb2c15450 'UISV-alignment' UIButton:0xcca237300.centerY == UIImageView:0xcca301a00.centerY (active)>",
"<NSLayoutConstraint:0xcb2c142d0 'UISV-canvas-connection' UIStackView:0xcca308c40.top == UIView:0xcca308e00.top (active)>",
"<NSLayoutConstraint:0xcb2c14320 'UISV-canvas-connection' V:[UIView:0xcca308fc0]-(0)-| (active, names: '|':UIStackView:0xcca308c40 )>",
"<NSLayoutConstraint:0xcb2c15220 'UISV-canvas-connection' UIStackView:0xcca309340.top == _UILayoutSpacer:0xcb3432600'UISV-alignment-spanner'.top (active)>",
"<NSLayoutConstraint:0xcb2c152c0 'UISV-canvas-connection' UIStackView:0xcca309340.centerY == UIButton:0xcca237300.centerY (active)>",
"<NSLayoutConstraint:0xcb2c15540 'UISV-canvas-connection' UIStackView:0xcca30a140.top == UIView:0xcca30a300.top (active)>",
"<NSLayoutConstraint:0xcb2c15590 'UISV-canvas-connection' V:[UIView:0xcca30a4c0]-(0)-| (active, names: '|':UIStackView:0xcca30a140 )>",
"<NSLayoutConstraint:0xcb2c15770 'UISV-canvas-connection' UIStackView:0xcca308a80.top == UIStackView:0xcca308c40.top (active)>",
"<NSLayoutConstraint:0xcb2c157c0 'UISV-canvas-connection' V:[UIStackView:0xcca30a140]-(0)-| (active, names: '|':UIStackView:0xcca308a80 )>",
"<NSLayoutConstraint:0xcb2c14370 'UISV-spacing' V:[UIView:0xcca308e00]-(5)-[UIView:0xcca308fc0] (active)>",
"<NSLayoutConstraint:0xcb2c155e0 'UISV-spacing' V:[UIView:0xcca30a300]-(5)-[UIView:0xcca30a4c0] (active)>",
"<NSLayoutConstraint:0xcb2c16030 'UISV-spacing' V:[UIStackView:0xcca308c40]-(4)-[UIStackView:0xcca309340] (active)>",
"<NSLayoutConstraint:0xcb2c16120 'UISV-spacing' V:[UIStackView:0xcca309340]-(4)-[UIStackView:0xcca30a140] (active)>",
"<NSLayoutConstraint:0xcb2c15040 'UISV-spanning-boundary' _UILayoutSpacer:0xcb3432600'UISV-alignment-spanner'.top <= UIImageView:0xcca301a00.top (active)>",
"<NSLayoutConstraint:0xcb2c15cc0 'UIView-Encapsulated-Layout-Height' UITableViewCellContentView:0xcca3088c0.height == 40.04 (active)>"
)

Will attempt to recover by breaking constraint
<NSLayoutConstraint:0xcb37cf930 UIImageView:0xcca301a00.height == 30 (active)>

Make a symbolic breakpoint at UIViewAlertForUnsatisfiableConstraints to catch this in the debugger.
The methods in the UIConstraintBasedLayoutDebugging category on UIView listed in <UIKitCore/UIView.h> may also be helpful.
Unable to simultaneously satisfy constraints.
Probably at least one of the constraints in the following list is one you don't want.
Try this:
(1) look at each constraint and try to figure out which you don't expect;
(2) find the code that added the unwanted constraint or constraints and fix it.
(
"<NSLayoutConstraint:0xcb37cdf40 UIView:0xcca308e00.height == 0 (active)>",
"<NSLayoutConstraint:0xcb37ce990 UIView:0xcca308fc0.height == 0 (active)>",
"<NSLayoutConstraint:0xcb37cfb60 UIView:0xcca309c00.height == 0 (active)>",
"<NSLayoutConstraint:0xcb37cfc00 UILabel:0xcb3761500.height >= 22 (active)>",
"<NSLayoutConstraint:0xcb37cfca0 UIView:0xcca309dc0.height == 0 (active)>",
"<NSLayoutConstraint:0xcb37cfd40 UIView:0xcca30a300.height == 0 (active)>",
"<NSLayoutConstraint:0xcb37cfd90 UIView:0xcca30a4c0.height == 0 (active)>",
"<NSLayoutConstraint:0xcb37cff70 V:[UIStackView:0xcca308a80]-(0)-| (active, names: '|':UITableViewCellContentView:0xcca3088c0 )>",
"<NSLayoutConstraint:0xcb37abcf0 V:|-(0)-[UIStackView:0xcca308a80] (active, names: '|':UITableViewCellContentView:0xcca3088c0 )>",
"<NSLayoutConstraint:0xcb2c154f0 'UISV-alignment' UIButton:0xcca237300.centerY == UIStackView:0xcca309a40.centerY (active)>",
"<NSLayoutConstraint:0xcb2c142d0 'UISV-canvas-connection' UIStackView:0xcca308c40.top == UIView:0xcca308e00.top (active)>",
"<NSLayoutConstraint:0xcb2c14320 'UISV-canvas-connection' V:[UIView:0xcca308fc0]-(0)-| (active, names: '|':UIStackView:0xcca308c40 )>",
"<NSLayoutConstraint:0xcb2c14960 'UISV-canvas-connection' UIStackView:0xcca309a40.top == UIView:0xcca309c00.top (active)>",
"<NSLayoutConstraint:0xcb2c149b0 'UISV-canvas-connection' V:[UIView:0xcca309dc0]-(0)-| (active, names: '|':UIStackView:0xcca309a40 )>",
"<NSLayoutConstraint:0xcb2c15270 'UISV-canvas-connection' V:[_UILayoutSpacer:0xcb3432600'UISV-alignment-spanner']-(0)-| (active, names: '|':UIStackView:0xcca309340 )>",
"<NSLayoutConstraint:0xcb2c152c0 'UISV-canvas-connection' UIStackView:0xcca309340.centerY == UIButton:0xcca237300.centerY (active)>",
"<NSLayoutConstraint:0xcb2c15540 'UISV-canvas-connection' UIStackView:0xcca30a140.top == UIView:0xcca30a300.top (active)>",
"<NSLayoutConstraint:0xcb2c15590 'UISV-canvas-connection' V:[UIView:0xcca30a4c0]-(0)-| (active, names: '|':UIStackView:0xcca30a140 )>",
"<NSLayoutConstraint:0xcb2c15770 'UISV-canvas-connection' UIStackView:0xcca308a80.top == UIStackView:0xcca308c40.top (active)>",
"<NSLayoutConstraint:0xcb2c157c0 'UISV-canvas-connection' V:[UIStackView:0xcca30a140]-(0)-| (active, names: '|':UIStackView:0xcca308a80 )>",
"<NSLayoutConstraint:0xcb2c14370 'UISV-spacing' V:[UIView:0xcca308e00]-(5)-[UIView:0xcca308fc0] (active)>",
"<NSLayoutConstraint:0xcb2c14a00 'UISV-spacing' V:[UIView:0xcca309c00]-(4)-[UILabel:0xcb3761500] (active)>",
"<NSLayoutConstraint:0xcb2c14a50 'UISV-spacing' V:[UILabel:0xcb3761500]-(4)-[UIView:0xcca309dc0] (active)>",
"<NSLayoutConstraint:0xcb2c155e0 'UISV-spacing' V:[UIView:0xcca30a300]-(5)-[UIView:0xcca30a4c0] (active)>",
"<NSLayoutConstraint:0xcb2c16030 'UISV-spacing' V:[UIStackView:0xcca308c40]-(4)-[UIStackView:0xcca309340] (active)>",
"<NSLayoutConstraint:0xcb2c16120 'UISV-spacing' V:[UIStackView:0xcca309340]-(4)-[UIStackView:0xcca30a140] (active)>",
"<NSLayoutConstraint:0xcb2c151d0 'UISV-spanning-boundary' _UILayoutSpacer:0xcb3432600'UISV-alignment-spanner'.bottom >= UIStackView:0xcca309a40.bottom (active)>",
"<NSLayoutConstraint:0xcb2c15cc0 'UIView-Encapsulated-Layout-Height' UITableViewCellContentView:0xcca3088c0.height == 40.04 (active)>"
)

Will attempt to recover by breaking constraint
<NSLayoutConstraint:0xcb37cfc00 UILabel:0xcb3761500.height >= 22 (active)>

Make a symbolic breakpoint at UIViewAlertForUnsatisfiableConstraints to catch this in the debugger.
The methods in the UIConstraintBasedLayoutDebugging category on UIView listed in <UIKitCore/UIView.h> may also be helpful.
Unable to simultaneously satisfy constraints.
Probably at least one of the constraints in the following list is one you don't want.
Try this:
(1) look at each constraint and try to figure out which you don't expect;
(2) find the code that added the unwanted constraint or constraints and fix it.
(
"<NSLayoutConstraint:0xcb2c14f00 UIView:0xcca30b100.height == 0 (active)>",
"<NSLayoutConstraint:0xcb2c15e50 UIView:0xcca30b2c0.height == 0 (active)>",
"<NSLayoutConstraint:0xcb2c15e00 UIView:0xcca30b480.height == 0 (active)>",
"<NSLayoutConstraint:0xcb2c16300 UILabel:0xcb3761880.height >= 22 (active)>",
"<NSLayoutConstraint:0xcb2c164e0 UIView:0xcca31c1c0.height == 0 (active)>",
"<NSLayoutConstraint:0xcb2c16530 UIView:0xcca31c540.height == 0 (active)>",
"<NSLayoutConstraint:0xcb2c16580 UIView:0xcca31c700.height == 0 (active)>",
"<NSLayoutConstraint:0xcb2c16760 V:[UIStackView:0xcca30ad80]-(0)-| (active, names: '|':UITableViewCellContentView:0xcca30a840 )>",
Unable to simultaneously satisfy constraints.
Probably at least one of the constraints in the following list is one you don't want.
Try this:
(1) look at each constraint and try to figure out which you don't expect;
(2) find the code that added the unwanted constraint or constraints and fix it.
(
"<NSLayoutConstraint:0xcb2c14f00 UIView:0xcca30b100.height == 0 (active)>",
"<NSLayoutConstraint:0xcb2c15e50 UIView:0xcca30b2c0.height == 0 (active)>",
"<NSLayoutConstraint:0xcb2c15810 UIImageView:0xcca303000.height == 30 (active)>",
"<NSLayoutConstraint:0xcb2c16530 UIView:0xcca31c540.height == 0 (active)>",
"<NSLayoutConstraint:0xcb2c16580 UIView:0xcca31c700.height == 0 (active)>",
"<NSLayoutConstraint:0xcb2c16760 V:[UIStackView:0xcca30ad80]-(0)-| (active, names: '|':UITableViewCellContentView:0xcca30a840 )>",
"<NSLayoutConstraint:0xcb2c167b0 V:|-(0)-[UIStackView:0xcca30ad80] (active, names: '|':UITableViewCellContentView:0xcca30a840 )>",
"<NSLayoutConstraint:0xcb2c17d40 'UISV-alignment' UIButton:0xcca310600.centerY == UIImageView:0xcca303000.centerY (active)>",
"<NSLayoutConstraint:0xcb2c16bc0 'UISV-canvas-connection' UIStackView:0xcca30af40.top == UIView:0xcca30b100.top (active)>",
"<NSLayoutConstraint:0xcb2c16c10 'UISV-canvas-connection' V:[UIView:0xcca30b2c0]-(0)-| (active, names: '|':UIStackView:0xcca30af40 )>",
"<NSLayoutConstraint:0xcb2c17b10 'UISV-canvas-connection' UIStackView:0xcca30b640.top == _UILayoutSpacer:0xcb3431500'UISV-alignment-spanner'.top (active)>",
"<NSLayoutConstraint:0xcb2c17bb0 'UISV-canvas-connection' UIStackView:0xcca30b640.centerY == UIButton:0xcca310600.centerY (active)>",
"<NSLayoutConstraint:0xcb2c17e30 'UISV-canvas-connection' UIStackView:0xcca31c380.top == UIView:0xcca31c540.top (active)>",
"<NSLayoutConstraint:0xcb2c17e80 'UISV-canvas-connection' V:[UIView:0xcca31c700]-(0)-| (active, names: '|':UIStackView:0xcca31c380 )>",
"<NSLayoutConstraint:0xcaff28000 'UISV-canvas-connection' UIStackView:0xcca30ad80.top == UIStackView:0xcca30af40.top (active)>",
"<NSLayoutConstraint:0xcaff28050 'UISV-canvas-connection' V:[UIStackView:0xcca31c380]-(0)-| (active, names: '|':UIStackView:0xcca30ad80 )>",
"<NSLayoutConstraint:0xcb2c16c60 'UISV-spacing' V:[UIView:0xcca30b100]-(5)-[UIView:0xcca30b2c0] (active)>",
"<NSLayoutConstraint:0xcb2c17ed0 'UISV-spacing' V:[UIView:0xcca31c540]-(5)-[UIView:0xcca31c700] (active)>",
"<NSLayoutConstraint:0xcaff28a00 'UISV-spacing' V:[UIStackView:0xcca30af40]-(4)-[UIStackView:0xcca30b640] (active)>",
"<NSLayoutConstraint:0xcaff28af0 'UISV-spacing' V:[UIStackView:0xcca30b640]-(4)-[UIStackView:0xcca31c380] (active)>",
"<NSLayoutConstraint:0xcb2c17930 'UISV-spanning-boundary' _UILayoutSpacer:0xcb3431500'UISV-alignment-spanner'.top <= UIImageView:0xcca303000.top (active)>",
"<NSLayoutConstraint:0xcaff28550 'UIView-Encapsulated-Layout-Height' UITableViewCellContentView:0xcca30a840.height == 40.04 (active)>"
)

Will attempt to recover by breaking constraint
<NSLayoutConstraint:0xcb2c15810 UIImageView:0xcca303000.height == 30 (active)>

Make a symbolic breakpoint at UIViewAlertForUnsatisfiableConstraints to catch this in the debugger.
The methods in the UIConstraintBasedLayoutDebugging category on UIView listed in <UIKitCore/UIView.h> may also be helpful.
Unable to simultaneously satisfy constraints.
Probably at least one of the constraints in the following list is one you don't want.
Try this:
(1) look at each constraint and try to figure out which you don't expect;
(2) find the code that added the unwanted constraint or constraints and fix it.
(
"<NSLayoutConstraint:0xcb2c14f00 UIView:0xcca30b100.height == 0 (active)>",
"<NSLayoutConstraint:0xcb2c15e50 UIView:0xcca30b2c0.height == 0 (active)>",
"<NSLayoutConstraint:0xcb2c16350 UIView:0xcca2fb800.height == 0 (active)>",
"<NSLayoutConstraint:0xcb2c163f0 UILabel:0xcb3761f80.height >= 22 (active)>",
"<NSLayoutConstraint:0xcb2c16490 UIView:0xcca31c000.height == 0 (active)>",
"<NSLayoutConstraint:0xcb2c16530 UIView:0xcca31c540.height == 0 (active)>",
"<NSLayoutConstraint:0xcb2c16580 UIView:0xcca31c700.height == 0 (active)>",
"<NSLayoutConstraint:0xcb2c16760 V:[UIStackView:0xcca30ad80]-(0)-| (active, names: '|':UITableViewCellContentView:0xcca30a840 )>",
"<NSLayoutConstraint:0xcb2c167b0 V:|-(0)-[UIStackView:0xcca30ad80] (active, names: '|':UITableViewCellContentView:0xcca30a840 )>",
"<NSLayoutConstraint:0xcb2c17de0 'UISV-alignment' UIButton:0xcca310600.centerY == UIStackView:0xcca30bd40.centerY (active)>",
"<NSLayoutConstraint:0xcb2c16bc0 'UISV-canvas-connection' UIStackView:0xcca30af40.top == UIView:0xcca30b100.top (active)>",
"<NSLayoutConstraint:0xcb2c16c10 'UISV-canvas-connection' V:[UIView:0xcca30b2c0]-(0)-| (active, names: '|':UIStackView:0xcca30af40 )>",
"<NSLayoutConstraint:0xcb2c17250 'UISV-canvas-connection' UIStackView:0xcca30bd40.top == UIView:0xcca2fb800.top (active)>",
"<NSLayoutConstraint:0xcb2c172a0 'UISV-canvas-connection' V:[UIView:0xcca31c000]-(0)-| (active, names: '|':UIStackView:0xcca30bd40 )>",
"<NSLayoutConstraint:0xcb2c17b60 'UISV-canvas-connection' V:[_UILayoutSpacer:0xcb3431500'UISV-alignment-spanner']-(0)-| (active, names: '|':UIStackView:0xcca30b640 )>",
"<NSLayoutConstraint:0xcb2c17bb0 'UISV-canvas-connection' UIStackView:0xcca30b640.centerY == UIButton:0xcca310600.centerY (active)>",
"<NSLayoutConstraint:0xcb2c17e30 'UISV-canvas-connection' UIStackView:0xcca31c380.top == UIView:0xcca31c540.top (active)>",
"<NSLayoutConstraint:0xcb2c17e80 'UISV-canvas-connection' V:[UIView:0xcca31c700]-(0)-| (active, names: '|':UIStackView:0xcca31c380 )>",
"<NSLayoutConstraint:0xcaff28000 'UISV-canvas-connection' UIStackView:0xcca30ad80.top == UIStackView:0xcca30af40.top (active)>",
"<NSLayoutConstraint:0xcaff28050 'UISV-canvas-connection' V:[UIStackView:0xcca31c380]-(0)-| (active, names: '|':UIStackView:0xcca30ad80 )>",
"<NSLayoutConstraint:0xcb2c16c60 'UISV-spacing' V:[UIView:0xcca30b100]-(5)-[UIView:0xcca30b2c0] (active)>",
"<NSLayoutConstraint:0xcb2c172f0 'UISV-spacing' V:[UIView:0xcca2fb800]-(4)-[UILabel:0xcb3761f80] (active)>",
"<NSLayoutConstraint:0xcb2c17340 'UISV-spacing' V:[UILabel:0xcb3761f80]-(4)-[UIView:0xcca31c000] (active)>",
"<NSLayoutConstraint:0xcb2c17ed0 'UISV-spacing' V:[UIView:0xcca31c540]-(5)-[UIView:0xcca31c700] (active)>",
"<NSLayoutConstraint:0xcaff28a00 'UISV-spacing' V:[UIStackView:0xcca30af40]-(4)-[UIStackView:0xcca30b640] (active)>",
"<NSLayoutConstraint:0xcaff28af0 'UISV-spacing' V:[UIStackView:0xcca30b640]-(4)-[UIStackView:0xcca31c380] (active)>",
"<NSLayoutConstraint:0xcb2c17ac0 'UISV-spanning-boundary' _UILayoutSpacer:0xcb3431500'UISV-alignment-spanner'.bottom >= UIStackView:0xcca30bd40.bottom (active)>",
"<NSLayoutConstraint:0xcaff28550 'UIView-Encapsulated-Layout-Height' UITableViewCellContentView:0xcca30a840.height == 40.04 (active)>"
)

Will attempt to recover by breaking constraint
<NSLayoutConstraint:0xcb2c163f0 UILabel:0xcb3761f80.height >= 22 (active)>

Make a symbolic breakpoint at UIViewAlertForUnsatisfiableConstraints to catch this in the debugger.
The methods in the UIConstraintBasedLayoutDebugging category on UIView listed in <UIKitCore/UIView.h> may also be helpful.
Unable to simultaneously satisfy constraints.
Probably at least one of the constraints in the following list is one you don't want.
Try this:
(1) look at each constraint and try to figure out which you don't expect;
(2) find the code that added the unwanted constraint or constraints and fix it.
(
"<NSLayoutConstraint:0xcaff286e0 UIView:0xcca31d500.height == 0 (active)>",
"<NSLayoutConstraint:0xcaff28690 UIView:0xcca31d6c0.height == 0 (active)>",
"<NSLayoutConstraint:0xcaff28730 UIView:0xcca31d880.height == 0 (active)>",
"<NSLayoutConstraint:0xcaff28c80 UILabel:0xcb3762300.height >= 22 (active)>",
"<NSLayoutConstraint:0xcaff28e60 UIView:0xcca31e680.height == 0 (active)>",
"<NSLayoutConstraint:0xcaff28eb0 UIView:0xcca31ea00.height == 0 (active)>",
"<NSLayoutConstraint:0xcaff28f00 UIView:0xcca31ebc0.height == 0 (active)>",
"<NSLayoutConstraint:0xcaff290e0 V:[UIStackView:0xcca31d180]-(0)-| (active, names: '|':UITableViewCellContentView:0xcca31cfc0 )>",
Unable to simultaneously satisfy constraints.
Probably at least one of the constraints in the following list is one you don't want.
Try this:
(1) look at each constraint and try to figure out which you don't expect;
(2) find the code that added the unwanted constraint or constraints and fix it.
(
"<NSLayoutConstraint:0xcaff286e0 UIView:0xcca31d500.height == 0 (active)>",
"<NSLayoutConstraint:0xcaff28690 UIView:0xcca31d6c0.height == 0 (active)>",
"<NSLayoutConstraint:0xcaff28d70 UILabel:0xcb3762a00.height >= 22 (active)>",
"<NSLayoutConstraint:0xcaff28c30 UIView:0xcca31e300.height == 0 (active)>",
"<NSLayoutConstraint:0xcaff28e10 UIView:0xcca31e4c0.height == 0 (active)>",
"<NSLayoutConstraint:0xcaff28eb0 UIView:0xcca31ea00.height == 0 (active)>",
"<NSLayoutConstraint:0xcaff28f00 UIView:0xcca31ebc0.height == 0 (active)>",
"<NSLayoutConstraint:0xcaff290e0 V:[UIStackView:0xcca31d180]-(0)-| (active, names: '|':UITableViewCellContentView:0xcca31cfc0 )>",
"<NSLayoutConstraint:0xcaff29130 V:|-(0)-[UIStackView:0xcca31d180] (active, names: '|':UITableViewCellContentView:0xcca31cfc0 )>",
"<NSLayoutConstraint:0xcaff2a760 'UISV-alignment' UIButton:0xcca310f00.centerY == UIStackView:0xcca31e140.centerY (active)>",
"<NSLayoutConstraint:0xcaff29540 'UISV-canvas-connection' UIStackView:0xcca31d340.top == UIView:0xcca31d500.top (active)>",
"<NSLayoutConstraint:0xcaff29590 'UISV-canvas-connection' V:[UIView:0xcca31d6c0]-(0)-| (active, names: '|':UIStackView:0xcca31d340 )>",
"<NSLayoutConstraint:0xcaff29bd0 'UISV-canvas-connection' UIStackView:0xcca31e140.top == UIView:0xcca31e300.top (active)>",
"<NSLayoutConstraint:0xcaff29c20 'UISV-canvas-connection' V:[UIView:0xcca31e4c0]-(0)-| (active, names: '|':UIStackView:0xcca31e140 )>",
"<NSLayoutConstraint:0xcaff2a4e0 'UISV-canvas-connection' V:[_UILayoutSpacer:0xcb3432400'UISV-alignment-spanner']-(0)-| (active, names: '|':UIStackView:0xcca31da40 )>",
"<NSLayoutConstraint:0xcaff2a530 'UISV-canvas-connection' UIStackView:0xcca31da40.centerY == UIButton:0xcca310f00.centerY (active)>",
"<NSLayoutConstraint:0xcaff2a7b0 'UISV-canvas-connection' UIStackView:0xcca31e840.top == UIView:0xcca31ea00.top (active)>",
"<NSLayoutConstraint:0xcaff2a800 'UISV-canvas-connection' V:[UIView:0xcca31ebc0]-(0)-| (active, names: '|':UIStackView:0xcca31e840 )>",
"<NSLayoutConstraint:0xcaff2a9e0 'UISV-canvas-connection' UIStackView:0xcca31d180.top == UIStackView:0xcca31d340.top (active)>",
"<NSLayoutConstraint:0xcaff2aa30 'UISV-canvas-connection' V:[UIStackView:0xcca31e840]-(0)-| (active, names: '|':UIStackView:0xcca31d180 )>",
"<NSLayoutConstraint:0xcaff295e0 'UISV-spacing' V:[UIView:0xcca31d500]-(5)-[UIView:0xcca31d6c0] (active)>",
"<NSLayoutConstraint:0xcaff29c70 'UISV-spacing' V:[UIView:0xcca31e300]-(4)-[UILabel:0xcb3762a00] (active)>",
"<NSLayoutConstraint:0xcaff29cc0 'UISV-spacing' V:[UILabel:0xcb3762a00]-(4)-[UIView:0xcca31e4c0] (active)>",
"<NSLayoutConstraint:0xcaff2a850 'UISV-spacing' V:[UIView:0xcca31ea00]-(5)-[UIView:0xcca31ebc0] (active)>",
"<NSLayoutConstraint:0xcaff2b250 'UISV-spacing' V:[UIStackView:0xcca31d340]-(4)-[UIStackView:0xcca31da40] (active)>",
"<NSLayoutConstraint:0xcaff2b340 'UISV-spacing' V:[UIStackView:0xcca31da40]-(4)-[UIStackView:0xcca31e840] (active)>",
"<NSLayoutConstraint:0xcaff2a440 'UISV-spanning-boundary' _UILayoutSpacer:0xcb3432400'UISV-alignment-spanner'.bottom >= UIStackView:0xcca31e140.bottom (active)>",
"<NSLayoutConstraint:0xcaff2af30 'UIView-Encapsulated-Layout-Height' UITableViewCellContentView:0xcca31cfc0.height == 40.04 (active)>"
)

Will attempt to recover by breaking constraint
<NSLayoutConstraint:0xcaff28d70 UILabel:0xcb3762a00.height >= 22 (active)>

Make a symbolic breakpoint at UIViewAlertForUnsatisfiableConstraints to catch this in the debugger.
The methods in the UIConstraintBasedLayoutDebugging category on UIView listed in <UIKitCore/UIView.h> may also be helpful.
Unable to simultaneously satisfy constraints.
Probably at least one of the constraints in the following list is one you don't want.
Try this:
(1) look at each constraint and try to figure out which you don't expect;
(2) find the code that added the unwanted constraint or constraints and fix it.
(
"<NSLayoutConstraint:0xcaff286e0 UIView:0xcca31d500.height == 0 (active)>",
"<NSLayoutConstraint:0xcaff28690 UIView:0xcca31d6c0.height == 0 (active)>",
"<NSLayoutConstraint:0xcaff280f0 UIImageView:0xcca303c00.height == 30 (active)>",
"<NSLayoutConstraint:0xcaff28eb0 UIView:0xcca31ea00.height == 0 (active)>",
"<NSLayoutConstraint:0xcaff28f00 UIView:0xcca31ebc0.height == 0 (active)>",
"<NSLayoutConstraint:0xcaff290e0 V:[UIStackView:0xcca31d180]-(0)-| (active, names: '|':UITableViewCellContentView:0xcca31cfc0 )>",
"<NSLayoutConstraint:0xcaff29130 V:|-(0)-[UIStackView:0xcca31d180] (active, names: '|':UITableViewCellContentView:0xcca31cfc0 )>",
"<NSLayoutConstraint:0xcaff2a6c0 'UISV-alignment' UIButton:0xcca310f00.centerY == UIImageView:0xcca303c00.centerY (active)>",
"<NSLayoutConstraint:0xcaff29540 'UISV-canvas-connection' UIStackView:0xcca31d340.top == UIView:0xcca31d500.top (active)>",
"<NSLayoutConstraint:0xcaff29590 'UISV-canvas-connection' V:[UIView:0xcca31d6c0]-(0)-| (active, names: '|':UIStackView:0xcca31d340 )>",
"<NSLayoutConstraint:0xcaff2a490 'UISV-canvas-connection' UIStackView:0xcca31da40.top == _UILayoutSpacer:0xcb3432400'UISV-alignment-spanner'.top (active)>",
"<NSLayoutConstraint:0xcaff2a530 'UISV-canvas-connection' UIStackView:0xcca31da40.centerY == UIButton:0xcca310f00.centerY (active)>",
"<NSLayoutConstraint:0xcaff2a7b0 'UISV-canvas-connection' UIStackView:0xcca31e840.top == UIView:0xcca31ea00.top (active)>",
"<NSLayoutConstraint:0xcaff2a800 'UISV-canvas-connection' V:[UIView:0xcca31ebc0]-(0)-| (active, names: '|':UIStackView:0xcca31e840 )>",
"<NSLayoutConstraint:0xcaff2a9e0 'UISV-canvas-connection' UIStackView:0xcca31d180.top == UIStackView:0xcca31d340.top (active)>",
"<NSLayoutConstraint:0xcaff2aa30 'UISV-canvas-connection' V:[UIStackView:0xcca31e840]-(0)-| (active, names: '|':UIStackView:0xcca31d180 )>",
"<NSLayoutConstraint:0xcaff295e0 'UISV-spacing' V:[UIView:0xcca31d500]-(5)-[UIView:0xcca31d6c0] (active)>",
"<NSLayoutConstraint:0xcaff2a850 'UISV-spacing' V:[UIView:0xcca31ea00]-(5)-[UIView:0xcca31ebc0] (active)>",
"<NSLayoutConstraint:0xcaff2b250 'UISV-spacing' V:[UIStackView:0xcca31d340]-(4)-[UIStackView:0xcca31da40] (active)>",
"<NSLayoutConstraint:0xcaff2b340 'UISV-spacing' V:[UIStackView:0xcca31da40]-(4)-[UIStackView:0xcca31e840] (active)>",
"<NSLayoutConstraint:0xcaff2a2b0 'UISV-spanning-boundary' _UILayoutSpacer:0xcb3432400'UISV-alignment-spanner'.top <= UIImageView:0xcca303c00.top (active)>",
"<NSLayoutConstraint:0xcaff2af30 'UIView-Encapsulated-Layout-Height' UITableViewCellContentView:0xcca31cfc0.height == 40.04 (active)>"
)

Will attempt to recover by breaking constraint
<NSLayoutConstraint:0xcaff280f0 UIImageView:0xcca303c00.height == 30 (active)>

Make a symbolic breakpoint at UIViewAlertForUnsatisfiableConstraints to catch this in the debugger.
The methods in the UIConstraintBasedLayoutDebugging category on UIView listed in <UIKitCore/UIView.h> may also be helpful.
Unable to simultaneously satisfy constraints.
Probably at least one of the constraints in the following list is one you don't want.
Try this:
(1) look at each constraint and try to figure out which you don't expect;
(2) find the code that added the unwanted constraint or constraints and fix it.
(
"<NSLayoutConstraint:0xcaff28190 UIView:0xcca31f9c0.height == 0 (active)>",
"<NSLayoutConstraint:0xcaff28ff0 UIView:0xcca31fb80.height == 0 (active)>",
"<NSLayoutConstraint:0xcaff2a170 UIView:0xcca31fd40.height == 0 (active)>",
"<NSLayoutConstraint:0xcaff2b4d0 UILabel:0xcb3762d80.height >= 22 (active)>",
"<NSLayoutConstraint:0xcaff2b6b0 UIView:0xcca324c40.height == 0 (active)>",
"<NSLayoutConstraint:0xcaff2b700 UIView:0xcca324fc0.height == 0 (active)>",
"<NSLayoutConstraint:0xcaff2b750 UIView:0xcca325180.height == 0 (active)>",
"<NSLayoutConstraint:0xcaff2b930 V:[UIStackView:0xcca31f640]-(0)-| (active, names: '|':UITableViewCellContentView:0xcca31f480 )>",
Unable to simultaneously satisfy constraints.
Probably at least one of the constraints in the following list is one you don't want.
Try this:
(1) look at each constraint and try to figure out which you don't expect;
(2) find the code that added the unwanted constraint or constraints and fix it.
(
"<NSLayoutConstraint:0xcaff28190 UIView:0xcca31f9c0.height == 0 (active)>",
"<NSLayoutConstraint:0xcaff28ff0 UIView:0xcca31fb80.height == 0 (active)>",
"<NSLayoutConstraint:0xcaff2aad0 UIImageView:0xcca340800.height == 30 (active)>",
"<NSLayoutConstraint:0xcaff2b700 UIView:0xcca324fc0.height == 0 (active)>",
"<NSLayoutConstraint:0xcaff2b750 UIView:0xcca325180.height == 0 (active)>",
"<NSLayoutConstraint:0xcaff2b930 V:[UIStackView:0xcca31f640]-(0)-| (active, names: '|':UITableViewCellContentView:0xcca31f480 )>",
"<NSLayoutConstraint:0xcaff2b980 V:|-(0)-[UIStackView:0xcca31f640] (active, names: '|':UITableViewCellContentView:0xcca31f480 )>",
"<NSLayoutConstraint:0xcaff40dc0 'UISV-alignment' UIButton:0xcca311800.centerY == UIImageView:0xcca340800.centerY (active)>",
"<NSLayoutConstraint:0xcaff2bd90 'UISV-canvas-connection' UIStackView:0xcca31f800.top == UIView:0xcca31f9c0.top (active)>",
"<NSLayoutConstraint:0xcaff2bde0 'UISV-canvas-connection' V:[UIView:0xcca31fb80]-(0)-| (active, names: '|':UIStackView:0xcca31f800 )>",
"<NSLayoutConstraint:0xcaff40b90 'UISV-canvas-connection' UIStackView:0xcca324000.top == _UILayoutSpacer:0xcb3431400'UISV-alignment-spanner'.top (active)>",
"<NSLayoutConstraint:0xcaff40c30 'UISV-canvas-connection' UIStackView:0xcca324000.centerY == UIButton:0xcca311800.centerY (active)>",
"<NSLayoutConstraint:0xcaff40eb0 'UISV-canvas-connection' UIStackView:0xcca324e00.top == UIView:0xcca324fc0.top (active)>",
"<NSLayoutConstraint:0xcaff40f00 'UISV-canvas-connection' V:[UIView:0xcca325180]-(0)-| (active, names: '|':UIStackView:0xcca324e00 )>",
"<NSLayoutConstraint:0xcaff410e0 'UISV-canvas-connection' UIStackView:0xcca31f640.top == UIStackView:0xcca31f800.top (active)>",
"<NSLayoutConstraint:0xcaff41130 'UISV-canvas-connection' V:[UIStackView:0xcca324e00]-(0)-| (active, names: '|':UIStackView:0xcca31f640 )>",
"<NSLayoutConstraint:0xcaff2be30 'UISV-spacing' V:[UIView:0xcca31f9c0]-(5)-[UIView:0xcca31fb80] (active)>",
"<NSLayoutConstraint:0xcaff40f50 'UISV-spacing' V:[UIView:0xcca324fc0]-(5)-[UIView:0xcca325180] (active)>",
"<NSLayoutConstraint:0xcaff419f0 'UISV-spacing' V:[UIStackView:0xcca31f800]-(4)-[UIStackView:0xcca324000] (active)>",
"<NSLayoutConstraint:0xcaff41ae0 'UISV-spacing' V:[UIStackView:0xcca324000]-(4)-[UIStackView:0xcca324e00] (active)>",
"<NSLayoutConstraint:0xcaff409b0 'UISV-spanning-boundary' _UILayoutSpacer:0xcb3431400'UISV-alignment-spanner'.top <= UIImageView:0xcca340800.top (active)>",
"<NSLayoutConstraint:0xcaff41630 'UIView-Encapsulated-Layout-Height' UITableViewCellContentView:0xcca31f480.height == 40.04 (active)>"
)

Will attempt to recover by breaking constraint
<NSLayoutConstraint:0xcaff2aad0 UIImageView:0xcca340800.height == 30 (active)>

Make a symbolic breakpoint at UIViewAlertForUnsatisfiableConstraints to catch this in the debugger.
The methods in the UIConstraintBasedLayoutDebugging category on UIView listed in <UIKitCore/UIView.h> may also be helpful.
Unable to simultaneously satisfy constraints.
Probably at least one of the constraints in the following list is one you don't want.
Try this:
(1) look at each constraint and try to figure out which you don't expect;
(2) find the code that added the unwanted constraint or constraints and fix it.
(
"<NSLayoutConstraint:0xcaff28190 UIView:0xcca31f9c0.height == 0 (active)>",
"<NSLayoutConstraint:0xcaff28ff0 UIView:0xcca31fb80.height == 0 (active)>",
"<NSLayoutConstraint:0xcaff2b480 UIView:0xcca3248c0.height == 0 (active)>",
"<NSLayoutConstraint:0xcaff2b5c0 UILabel:0xcb3763480.height >= 22 (active)>",
"<NSLayoutConstraint:0xcaff2b660 UIView:0xcca324a80.height == 0 (active)>",
"<NSLayoutConstraint:0xcaff2b700 UIView:0xcca324fc0.height == 0 (active)>",
"<NSLayoutConstraint:0xcaff2b750 UIView:0xcca325180.height == 0 (active)>",
"<NSLayoutConstraint:0xcaff2b930 V:[UIStackView:0xcca31f640]-(0)-| (active, names: '|':UITableViewCellContentView:0xcca31f480 )>",
"<NSLayoutConstraint:0xcaff2b980 V:|-(0)-[UIStackView:0xcca31f640] (active, names: '|':UITableViewCellContentView:0xcca31f480 )>",
"<NSLayoutConstraint:0xcaff40e60 'UISV-alignment' UIButton:0xcca311800.centerY == UIStackView:0xcca324700.centerY (active)>",
"<NSLayoutConstraint:0xcaff2bd90 'UISV-canvas-connection' UIStackView:0xcca31f800.top == UIView:0xcca31f9c0.top (active)>",
"<NSLayoutConstraint:0xcaff2bde0 'UISV-canvas-connection' V:[UIView:0xcca31fb80]-(0)-| (active, names: '|':UIStackView:0xcca31f800 )>",
"<NSLayoutConstraint:0xcaff402d0 'UISV-canvas-connection' UIStackView:0xcca324700.top == UIView:0xcca3248c0.top (active)>",
"<NSLayoutConstraint:0xcaff40320 'UISV-canvas-connection' V:[UIView:0xcca324a80]-(0)-| (active, names: '|':UIStackView:0xcca324700 )>",
"<NSLayoutConstraint:0xcaff40be0 'UISV-canvas-connection' V:[_UILayoutSpacer:0xcb3431400'UISV-alignment-spanner']-(0)-| (active, names: '|':UIStackView:0xcca324000 )>",
"<NSLayoutConstraint:0xcaff40c30 'UISV-canvas-connection' UIStackView:0xcca324000.centerY == UIButton:0xcca311800.centerY (active)>",
"<NSLayoutConstraint:0xcaff40eb0 'UISV-canvas-connection' UIStackView:0xcca324e00.top == UIView:0xcca324fc0.top (active)>",
"<NSLayoutConstraint:0xcaff40f00 'UISV-canvas-connection' V:[UIView:0xcca325180]-(0)-| (active, names: '|':UIStackView:0xcca324e00 )>",
"<NSLayoutConstraint:0xcaff410e0 'UISV-canvas-connection' UIStackView:0xcca31f640.top == UIStackView:0xcca31f800.top (active)>",
"<NSLayoutConstraint:0xcaff41130 'UISV-canvas-connection' V:[UIStackView:0xcca324e00]-(0)-| (active, names: '|':UIStackView:0xcca31f640 )>",
"<NSLayoutConstraint:0xcaff2be30 'UISV-spacing' V:[UIView:0xcca31f9c0]-(5)-[UIView:0xcca31fb80] (active)>",
"<NSLayoutConstraint:0xcaff40370 'UISV-spacing' V:[UIView:0xcca3248c0]-(4)-[UILabel:0xcb3763480] (active)>",
"<NSLayoutConstraint:0xcaff403c0 'UISV-spacing' V:[UILabel:0xcb3763480]-(4)-[UIView:0xcca324a80] (active)>",
"<NSLayoutConstraint:0xcaff40f50 'UISV-spacing' V:[UIView:0xcca324fc0]-(5)-[UIView:0xcca325180] (active)>",
"<NSLayoutConstraint:0xcaff419f0 'UISV-spacing' V:[UIStackView:0xcca31f800]-(4)-[UIStackView:0xcca324000] (active)>",
"<NSLayoutConstraint:0xcaff41ae0 'UISV-spacing' V:[UIStackView:0xcca324000]-(4)-[UIStackView:0xcca324e00] (active)>",
"<NSLayoutConstraint:0xcaff40b40 'UISV-spanning-boundary' _UILayoutSpacer:0xcb3431400'UISV-alignment-spanner'.bottom >= UIStackView:0xcca324700.bottom (active)>",
"<NSLayoutConstraint:0xcaff41630 'UIView-Encapsulated-Layout-Height' UITableViewCellContentView:0xcca31f480.height == 40.04 (active)>"
)

Will attempt to recover by breaking constraint
<NSLayoutConstraint:0xcaff2b5c0 UILabel:0xcb3763480.height >= 22 (active)>

Make a symbolic breakpoint at UIViewAlertForUnsatisfiableConstraints to catch this in the debugger.
The methods in the UIConstraintBasedLayoutDebugging category on UIView listed in <UIKitCore/UIView.h> may also be helpful.
Unable to simultaneously satisfy constraints.
Probably at least one of the constraints in the following list is one you don't want.
Try this:
(1) look at each constraint and try to figure out which you don't expect;
(2) find the code that added the unwanted constraint or constraints and fix it.
(
"<NSLayoutConstraint:0xcaff40870 UIView:0xcca325f80.height == 0 (active)>",
"<NSLayoutConstraint:0xcaff417c0 UIView:0xcca326140.height == 0 (active)>",
"<NSLayoutConstraint:0xcaff41770 UIView:0xcca326300.height == 0 (active)>",
"<NSLayoutConstraint:0xcaff41c70 UILabel:0xcb3763800.height >= 22 (active)>",
"<NSLayoutConstraint:0xcaff41e50 UIView:0xcca327100.height == 0 (active)>",
"<NSLayoutConstraint:0xcaff41ea0 UIView:0xcca327480.height == 0 (active)>",
"<NSLayoutConstraint:0xcaff41ef0 UIView:0xcca327640.height == 0 (active)>",
"<NSLayoutConstraint:0xcaff420d0 V:[UIStackView:0xcca325c00]-(0)-| (active, names: '|':UITableViewCellContentView:0xcca325a40 )>",
Unable to simultaneously satisfy constraints.
Probably at least one of the constraints in the following list is one you don't want.
Try this:
(1) look at each constraint and try to figure out which you don't expect;
(2) find the code that added the unwanted constraint or constraints and fix it.
(
"<NSLayoutConstraint:0xcaff40870 UIView:0xcca325f80.height == 0 (active)>",
"<NSLayoutConstraint:0xcaff417c0 UIView:0xcca326140.height == 0 (active)>",
"<NSLayoutConstraint:0xcaff41d60 UILabel:0xcb2c60000.height >= 22 (active)>",
"<NSLayoutConstraint:0xcaff41c20 UIView:0xcca326d80.height == 0 (active)>",
"<NSLayoutConstraint:0xcaff41e00 UIView:0xcca326f40.height == 0 (active)>",
"<NSLayoutConstraint:0xcaff41ea0 UIView:0xcca327480.height == 0 (active)>",
"<NSLayoutConstraint:0xcaff41ef0 UIView:0xcca327640.height == 0 (active)>",
"<NSLayoutConstraint:0xcaff420d0 V:[UIStackView:0xcca325c00]-(0)-| (active, names: '|':UITableViewCellContentView:0xcca325a40 )>",
"<NSLayoutConstraint:0xcaff42120 V:|-(0)-[UIStackView:0xcca325c00] (active, names: '|':UITableViewCellContentView:0xcca325a40 )>",
"<NSLayoutConstraint:0xcaff43750 'UISV-alignment' UIButton:0xcca312100.centerY == UIStackView:0xcca326bc0.centerY (active)>",
"<NSLayoutConstraint:0xcaff42530 'UISV-canvas-connection' UIStackView:0xcca325dc0.top == UIView:0xcca325f80.top (active)>",
"<NSLayoutConstraint:0xcaff42580 'UISV-canvas-connection' V:[UIView:0xcca326140]-(0)-| (active, names: '|':UIStackView:0xcca325dc0 )>",
"<NSLayoutConstraint:0xcaff42bc0 'UISV-canvas-connection' UIStackView:0xcca326bc0.top == UIView:0xcca326d80.top (active)>",
"<NSLayoutConstraint:0xcaff42c10 'UISV-canvas-connection' V:[UIView:0xcca326f40]-(0)-| (active, names: '|':UIStackView:0xcca326bc0 )>",
"<NSLayoutConstraint:0xcaff434d0 'UISV-canvas-connection' V:[_UILayoutSpacer:0xcb3431c00'UISV-alignment-spanner']-(0)-| (active, names: '|':UIStackView:0xcca3264c0 )>",
"<NSLayoutConstraint:0xcaff43520 'UISV-canvas-connection' UIStackView:0xcca3264c0.centerY == UIButton:0xcca312100.centerY (active)>",
"<NSLayoutConstraint:0xcaff437a0 'UISV-canvas-connection' UIStackView:0xcca3272c0.top == UIView:0xcca327480.top (active)>",
"<NSLayoutConstraint:0xcaff437f0 'UISV-canvas-connection' V:[UIView:0xcca327640]-(0)-| (active, names: '|':UIStackView:0xcca3272c0 )>",
"<NSLayoutConstraint:0xcaff439d0 'UISV-canvas-connection' UIStackView:0xcca325c00.top == UIStackView:0xcca325dc0.top (active)>",
"<NSLayoutConstraint:0xcaff43a20 'UISV-canvas-connection' V:[UIStackView:0xcca3272c0]-(0)-| (active, names: '|':UIStackView:0xcca325c00 )>",
"<NSLayoutConstraint:0xcaff425d0 'UISV-spacing' V:[UIView:0xcca325f80]-(5)-[UIView:0xcca326140] (active)>",
"<NSLayoutConstraint:0xcaff42c60 'UISV-spacing' V:[UIView:0xcca326d80]-(4)-[UILabel:0xcb2c60000] (active)>",
"<NSLayoutConstraint:0xcaff42cb0 'UISV-spacing' V:[UILabel:0xcb2c60000]-(4)-[UIView:0xcca326f40] (active)>",
"<NSLayoutConstraint:0xcaff43840 'UISV-spacing' V:[UIView:0xcca327480]-(5)-[UIView:0xcca327640] (active)>",
"<NSLayoutConstraint:0xcaff483c0 'UISV-spacing' V:[UIStackView:0xcca325dc0]-(4)-[UIStackView:0xcca3264c0] (active)>",
"<NSLayoutConstraint:0xcaff484b0 'UISV-spacing' V:[UIStackView:0xcca3264c0]-(4)-[UIStackView:0xcca3272c0] (active)>",
"<NSLayoutConstraint:0xcaff43430 'UISV-spanning-boundary' _UILayoutSpacer:0xcb3431c00'UISV-alignment-spanner'.bottom >= UIStackView:0xcca326bc0.bottom (active)>",
"<NSLayoutConstraint:0xcaff43f20 'UIView-Encapsulated-Layout-Height' UITableViewCellContentView:0xcca325a40.height == 40.04 (active)>"
)

Will attempt to recover by breaking constraint
<NSLayoutConstraint:0xcaff41d60 UILabel:0xcb2c60000.height >= 22 (active)>

Make a symbolic breakpoint at UIViewAlertForUnsatisfiableConstraints to catch this in the debugger.
The methods in the UIConstraintBasedLayoutDebugging category on UIView listed in <UIKitCore/UIView.h> may also be helpful.
Unable to simultaneously satisfy constraints.
Probably at least one of the constraints in the following list is one you don't want.
Try this:
(1) look at each constraint and try to figure out which you don't expect;
(2) find the code that added the unwanted constraint or constraints and fix it.
(
"<NSLayoutConstraint:0xcaff40870 UIView:0xcca325f80.height == 0 (active)>",
"<NSLayoutConstraint:0xcaff417c0 UIView:0xcca326140.height == 0 (active)>",
"<NSLayoutConstraint:0xcaff411d0 UIImageView:0xcca341400.height == 30 (active)>",
"<NSLayoutConstraint:0xcaff41ea0 UIView:0xcca327480.height == 0 (active)>",
"<NSLayoutConstraint:0xcaff41ef0 UIView:0xcca327640.height == 0 (active)>",
"<NSLayoutConstraint:0xcaff420d0 V:[UIStackView:0xcca325c00]-(0)-| (active, names: '|':UITableViewCellContentView:0xcca325a40 )>",
"<NSLayoutConstraint:0xcaff42120 V:|-(0)-[UIStackView:0xcca325c00] (active, names: '|':UITableViewCellContentView:0xcca325a40 )>",
"<NSLayoutConstraint:0xcaff436b0 'UISV-alignment' UIButton:0xcca312100.centerY == UIImageView:0xcca341400.centerY (active)>",
"<NSLayoutConstraint:0xcaff42530 'UISV-canvas-connection' UIStackView:0xcca325dc0.top == UIView:0xcca325f80.top (active)>",
"<NSLayoutConstraint:0xcaff42580 'UISV-canvas-connection' V:[UIView:0xcca326140]-(0)-| (active, names: '|':UIStackView:0xcca325dc0 )>",
"<NSLayoutConstraint:0xcaff43480 'UISV-canvas-connection' UIStackView:0xcca3264c0.top == _UILayoutSpacer:0xcb3431c00'UISV-alignment-spanner'.top (active)>",
"<NSLayoutConstraint:0xcaff43520 'UISV-canvas-connection' UIStackView:0xcca3264c0.centerY == UIButton:0xcca312100.centerY (active)>",
"<NSLayoutConstraint:0xcaff437a0 'UISV-canvas-connection' UIStackView:0xcca3272c0.top == UIView:0xcca327480.top (active)>",
"<NSLayoutConstraint:0xcaff437f0 'UISV-canvas-connection' V:[UIView:0xcca327640]-(0)-| (active, names: '|':UIStackView:0xcca3272c0 )>",
"<NSLayoutConstraint:0xcaff439d0 'UISV-canvas-connection' UIStackView:0xcca325c00.top == UIStackView:0xcca325dc0.top (active)>",
"<NSLayoutConstraint:0xcaff43a20 'UISV-canvas-connection' V:[UIStackView:0xcca3272c0]-(0)-| (active, names: '|':UIStackView:0xcca325c00 )>",
"<NSLayoutConstraint:0xcaff425d0 'UISV-spacing' V:[UIView:0xcca325f80]-(5)-[UIView:0xcca326140] (active)>",
"<NSLayoutConstraint:0xcaff43840 'UISV-spacing' V:[UIView:0xcca327480]-(5)-[UIView:0xcca327640] (active)>",
"<NSLayoutConstraint:0xcaff483c0 'UISV-spacing' V:[UIStackView:0xcca325dc0]-(4)-[UIStackView:0xcca3264c0] (active)>",
"<NSLayoutConstraint:0xcaff484b0 'UISV-spacing' V:[UIStackView:0xcca3264c0]-(4)-[UIStackView:0xcca3272c0] (active)>",
"<NSLayoutConstraint:0xcaff432a0 'UISV-spanning-boundary' _UILayoutSpacer:0xcb3431c00'UISV-alignment-spanner'.top <= UIImageView:0xcca341400.top (active)>",
"<NSLayoutConstraint:0xcaff43f20 'UIView-Encapsulated-Layout-Height' UITableViewCellContentView:0xcca325a40.height == 40.04 (active)>"
)

Will attempt to recover by breaking constraint
<NSLayoutConstraint:0xcaff411d0 UIImageView:0xcca341400.height == 30 (active)>

Make a symbolic breakpoint at UIViewAlertForUnsatisfiableConstraints to catch this in the debugger.
The methods in the UIConstraintBasedLayoutDebugging category on UIView listed in <UIKitCore/UIView.h> may also be helpful.
cannot add handler to 4 from 1 - dropping
cannot add handler to 3 from 1 - dropping
INFO: [OAMapRendererView 0xcbfafea00] Rendering suspended
WebContent[ 97 731 ] 0x123058100 - [sessionID=1] WebProcess::updateFreezerStatus: isFreezable=1, error=-1
cannot add handler to 4 from 1 - dropping
cannot add handler to 3 from 1 - dropping

}
let screenElementsSection = UIMenu(title: "", options: .displayInline, children: [screenElementsAction])
let profileActionsSection = UIMenu(title: "", options: .displayInline, children: [copyAction, resetAction])
let menu = UIMenu(title: "", children: [screenElementsSection, profileActionsSection])

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

composedMenu?

let screenElementsViewController = ScreenElementsViewController(appMode: appMode)
screenElementsViewController.delegate = self
let navigationController = UINavigationController(rootViewController: screenElementsViewController)
navigationController.modalPresentationStyle = .pageSheet

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Is this the expected behavior on iPad?

Copy link
Copy Markdown
Contributor Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

yes

}
}

func iconName(for screenLayoutMode: ScreenLayoutMode) -> String {

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Why don't you use the generated icon?

Copy link
Copy Markdown
Contributor Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

because I set it to panelsLayoutRow.iconName as string value

}
}

func imageName(for screenLayoutMode: ScreenLayoutMode) -> String {

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

up

Copy link
Copy Markdown
Contributor Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

because I set it to previewRow.iconName as string value


init(appMode: OAApplicationMode) {
private var allPreferenceLayoutModes: [NSNumber?] {
var preferenceLayoutModes: [NSNumber?] = [nil]

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

why do we need [NSNumber?] here instead of [ScreenLayoutMode?]?

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

private var allPreferenceLayoutModes: [NSNumber?] {
[nil] + ScreenLayoutMode.allCases.map { NSNumber(value: $0.rawValue) }
}

Copy link
Copy Markdown
Contributor Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

why do we need [NSNumber?] here instead of [ScreenLayoutMode?]?

we need it to fit android behaviour on objective c side

filterModes: Int(kWidgetModeMatchingPanels),
panels: panels,
layoutMode: preferenceLayoutMode)
for widgetInfo in widgetInfos! {

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

widgetInfos!

widgetsVisibility.removeAll(where: { $0 == key })
widgetsVisibility.removeAll(where: { $0 == COLLAPSED_PREFIX + key })
widgetsVisibility.removeAll(where: { $0 == HIDE_PREFIX + key })
widgetsVisibility.removeAll(where: { $0 == "" })

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

?

Copy link
Copy Markdown
Contributor Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Empty entries are now filtered out in widgetsVisibility(_:screenLayoutMode:) using .filter { !$0.isEmpty } when parsing the preference. The array returned here therefore contains no empty strings, so this additional cleanup was redundant. It fits android behaviour

static let rightPanel = WidgetsPanel("ic_custom_screen_side_right", title: localizedString("map_widget_right"))
static let topPanel = WidgetsPanel("ic_custom_screen_side_top", title: localizedString("top_widgets_panel"))
static let bottomPanel = WidgetsPanel("ic_custom_screen_side_bottom", title: localizedString("bottom_widgets_panel"))
static let leftPanel = WidgetsPanel("ic_custom_screen_side_left",

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

use from asset

Copy link
Copy Markdown
Contributor Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

I'm not sure. We need string format for func iconName(for screenLayoutMode: ScreenLayoutMode) -> String that is used for row.iconName = panel.iconName(for: screenLayoutMode)

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Yes, you can use Row.icon = UIImage here.

func getWidgetOrder(_ widgetId: String, appMode: OAApplicationMode) -> Int {
return getPagedOrder(widgetId, appMode: appMode).1

private func getRtlPanel(rtl: Bool) -> WidgetsPanel {

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

private func rtlPanel(isRtl: Bool) -> WidgetsPanel

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

guard rtl else { return self }

switch self {
case .leftPanel:
    return .rightPanel
case .rightPanel:
    return .leftPanel
case .topPanel, .bottomPanel:
    return self
}

UIImage(named: "ic_custom20_screen_side_bottom")!])
let useLandscapeIcons = screenLayoutMode == .landscape
&& OAAppSettings.sharedManager().useSeparateLayouts.get(selectedAppMode)
let iconNames = useLandscapeIcons

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

asset name

class ConfigureScreenViewController: OABaseNavbarSubviewViewController, AppModeSelectionDelegate, WidgetStateDelegate, MapButtonsDelegate {

private enum RawKey: String {
case screenElements = "screen_elements"

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

"screen_elements" ?

Comment on lines +239 to +243
return storedWidgetInfos.enumerated().sorted {
$0.element.pageIndex == $1.element.pageIndex
? $0.offset < $1.offset
: $0.element.pageIndex < $1.element.pageIndex
}.map(\.element)

@tigrim tigrim Sep 14, 2026

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Preserve the saved widget order within each page

When copying from the orientation that is not currently displayed, widgetsForAppMode:layoutMode: creates a fresh widget set in initializer order. The registry only sorts that set by pageIndex, and this comparator preserves its original offset within each page, even though priority was just loaded from the saved layout. Consequently, manually reordered widgets are copied in initializer order instead of the order shown in the source layout. For example, reorder two widgets on the same landscape page, keep the device in portrait, and select Copy from landscape layout: their saved relative order is lost. Please sort by pageIndex and then priority before building newPagedOrder.

Comment on lines +72 to +75
override func copyPrefs(from fromAppMode: OAApplicationMode,
appMode toAppMode: OAApplicationMode,
customId: String?) {
Self.registerPreference(customId: customId).set(distanceModePreference.get(fromAppMode), mode: toAppMode)

@tigrim tigrim Sep 14, 2026

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Expose the widget state so the new copy method is reached

This override is never reached by the new panel-copy flow: OABaseWidgetView.copySettingsFromMode obtains the state through storedWidgetState(), but TripRecordingDistanceWidget and its base classes do not override that accessor, so it returns nil. Copying a widget configured for Last uphill into a profile with the default settings therefore produces Total distance instead of preserving the source mode. The other stateful trip-recording widgets and GlideTargetWidget have the same missing connection. Please override storedWidgetState() in those widgets to return their state, as GlideAverageWidget already does, so the added copyPrefs(from:appMode:customId:) implementations actually run.

BOOL isCompactPortrait = isPortrait && _settings.isCompactPanelsLayout && ![OAUtilities isiOSAppOnMac];
BOOL useMultipleRows = isCompactPortrait
? _destinationCells.count > 1
: isPortrait && [UIDevice currentDevice].userInterfaceIdiom != UIUserInterfaceIdiomPad;

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

!isIPad

static let rightPanel = WidgetsPanel("ic_custom_screen_side_right", title: localizedString("map_widget_right"))
static let topPanel = WidgetsPanel("ic_custom_screen_side_top", title: localizedString("top_widgets_panel"))
static let bottomPanel = WidgetsPanel("ic_custom_screen_side_bottom", title: localizedString("bottom_widgets_panel"))
static let leftPanel = WidgetsPanel("ic_custom_screen_side_left",

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Yes, you can use Row.icon = UIImage here.

@alex-dev-neo

Copy link
Copy Markdown
Contributor

Reviewed 32748efe7c against the Android implementation in master.

What checks out

  • The layout key scheme matches Android. portrait_map_info_controls, portrait_custom_widgets_keys, portrait_transparent_map_theme, portrait_left_widget_panel_order — same shape as getLayoutPreference's layoutMode.name().toLowerCase() + "_" + basePref.getId(). I re-checked the one contested pairing: _topWidgetPanelOrder with topWidgetPanelOrderOldKey is correct. Android's live ids are top_widget_panel_order / bottom_widget_panel_order; widget_top_panel_order is the @Deprecated one. iOS named them the other way round historically, so the derived keys line up exactly.
  • setupCopy is a faithful port of CommonPreference.setupCopy (minus cache, which doesn't exist here).
  • The trailing separator in mapInfoControls ("a;b;") is the reference storage format — MapWidgetInfo.enableDisable on Android appends without a trim.
  • Coverage of the new APIs is complete: all 13 OAWidgetState subclasses that override copyPrefs also override copyPrefs(from:); both widgets overriding copySettings(_:customId:) also override copySettings(from:); all 7 plugins pass delegate.preferenceLayoutMode; storedWidgetState() is overridden in every Trip-recording widget. The two review threads still marked unresolved (plugins / TripRecordingDistanceWidgetState) are already addressed at head.
  • Resources and build: all 16 new keys exist in en.lproj; every new asset symbol resolves to a real imageset (including img_panels_layout_landscape_compact_2.imgPanelsLayoutLandscapeCompact2); the six new files are in pbxproj; no dangling references to any removed or renamed API remain (OAWidgetsPanel, getWidgetsForPanel, getOrderPreference, WidgetUtils.reorderWidgets, OAConfigureScreenViewController, resetDefaultAppearance — zero hits each).

Findings

1. panels_layout_mode keys diverge from Android, and Shared mode isn't actually shared

OAAppSettings.m:7190 builds <single|separate>_<portrait|landscape>_panels_layout_mode — four values. Android has three: panels_layout_mode for shared and portrait_/landscape_panels_layout_mode for separate.

These preferences are registered via registerPreference:forKey:, and OAProfileSettingsItem.writeItemsToJson exports everything from getRegisteredPreferences under its key — so this setting cannot round-trip a profile between platforms. Second consequence: in Shared mode Android keeps one value for both orientations, iOS keeps two.

The shared-landscape screen suggests the second part is deliberate. If so, the key should still be derived through layoutPreference: so at least the independent case matches Android.

2. The base copyWithKey: returns nil in Release

OAAppSettings.m:1640 is NSAssert(NO, …); return nil;. Release builds compile with -DNS_BLOCK_ASSERTIONS=1, so the assertion is stripped and layoutPreference: inserts nil into the map table. Latent today — all four copied types override it — but Android enforces this at compile time with public abstract CommonPreference<T> copyWithId(…), and here the first new layout-scoped preference type will only fail in Release. An @throw instead of NSAssert, or a nil check in layoutPreference:, closes it.

3. The widget set is rebuilt on every query for a non-current combination

OAMapWidgetRegistry.mm:327 (widgetsForAppMode:layoutMode:) calls createAllControlsWithAppMode: on a cache miss and never updates the cache — _cachedAppMode is only written in registerAllControls. Matching Android, which keeps no cache at all, is fine in itself, but a few call sites do it in a loop: WidgetGroupItemsViewController.swift:36 resolves widgetInfo(for:appMode:screenLayoutMode:) once per widget in the group, i.e. N full builds of ~60 UIViews. ConfigureScreenViewController.getWidgetsCount adds four more per reload. Building the set once per screen and passing it down would avoid it.

4. The deferred layoutWidgets won't fire during gestures

OAMapInfoController.mm:1005 replaced the synchronous call with performSelector:withObject:afterDelay:0. That timer is scheduled in NSDefaultRunLoopMode only. onPanelSizeChanged originates from viewDidLayoutSubviews of a panel hosted in a UIPageViewController with a scroll transition — while a widget-page swipe is tracking, the runloop is in UITrackingRunLoopMode and the constraint pass is postponed until the gesture ends. A coalescing flag plus dispatch_async(dispatch_get_main_queue(), …) gives the same collapsing without the mode dependency.

5. Compact-portrait geometry is derived from default button sizes

OAMapInfoController.mm:505 computes topButtonsMargin / bottomButtonsMargin from ButtonAppearanceParams.smallSize / bigSize (40/48), but map button size is user-configurable via getDefaultSizePref and position via fabMarginPref. In the same block availableWidth falls back to DeviceScreenWidth (:499), and WidgetPageViewController.swift:108,112 uses UIScreen.main.bounds.width — both wrong under Split View, Stage Manager and windowed mode on Mac, which is exactly what isWindowed / isiOSAppOnMac elsewhere in this PR is there to handle.

6. OATextInfoWidget.widgetInfo resolves through the live registry by id

OATextInfoWidget.mm:1051 looks the info up in OAMapWidgetRegistry by widget id. Now that a widget set for the non-current orientation can exist alongside the live one, a transient landscape widget gets the portrait panel back, which feeds registerWidgetSizePref's default and configureSimpleLayout. registerWidgetSizePref (:1057) already hedges with a second source, but that one also uses ScreenLayoutModeWrapper defaultForAppMode: — the current orientation, not the one the widget was built for.

7. Changes outside the feature's scope

OAValueTableViewCell.m:29 stops calling layoutIfNeeded on Mac — that is global for every value cell in the app. OATextInfoWidget drops the image width constraint in the vertical-stack layout. OADestinationBarWidget.adjustViewSize is rewritten. resetConfigureScreenSettings / copyConfigureScreenSettings grow to cover the speedometer, distance-by-tap text size, all default button states and the size/opacity/corner/glass prefs — probably intentional alignment with Android, but "Reset to default" now destroys noticeably more. On top of that, the get*-to-property rename sweep (OAWidgetsPanelWidgetsPanel, getWidgetStatestoredWidgetState, …) touches most of the 119 files and buries the feature diff. The direction is right; as a separate PR it would have been far cheaper to review.

8. Product question, not a code defect

migrateWidgetLayoutPreferences seeds portrait_* / landscape_* from the base preferences once, at upgrade. Anyone who configures widgets after the upgrade and then enables Independent gets the snapshot taken at upgrade time; a fresh install gets plain defaults. Android behaves the same way, so this is parity — but "Switch to Independent" will still look like a reset. Seeding at the moment of the toggle rather than in a migration would fix that.

Nothing here is a blocker in the sense of breaking immediately: 1 and 2 are latent, 3–6 are quality and edge cases.

@Vladyslav-lys

Copy link
Copy Markdown
Contributor Author

As for 1. panels_layout_mode keys diverge from Android, and Shared mode isn't actually shared, the value and keys must differ from Android, confirmed by product manager

@Vladyslav-lys

Copy link
Copy Markdown
Contributor Author

As for 5. Compact-portrait geometry is derived from default button sizes

Updated WidgetPageViewController to calculate side-panel width limits from the HUD container’s bounds, falling back to OAUtilities.calculateScreenWidth() when the container has no width yet.

One clarification: DeviceScreenWidth already calls OAUtilities.calculateScreenWidth(), which uses the main window’s width when available, rather than always using the display width.

I kept the button-margin formulas unchanged because they match Android’s MapHudLayout. Button positioning and overlap handling are performed separately by MapHudLayout, which accounts for configured button sizes and positions.

@Vladyslav-lys

Copy link
Copy Markdown
Contributor Author

As for 7. Changes outside the feature's scope

The constraint-warning fixes are being handled separately in another branch.
The OADestinationBarWidget changes are required to support Wide/Compact layouts independently of device orientation. The expanded Reset/Copy behavior is intentional: these actions cover Configure Screen settings, not just widget lists.

@Vladyslav-lys

Copy link
Copy Markdown
Contributor Author

As for 8. Product question, not a code defect

Android parity is a requirement here, so we’ll keep the current behavior: the migration seeds the separate layouts, while switching between Shared and Independent only selects the corresponding stored configuration. Copying on toggle would change that behavior and could overwrite previously configured Independent layouts.

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

Allow to set different widget layout for Landscape / Portrait

4 participants