ios - UIAlertControllerInterfaceActionGroupView 模糊布局
问题描述
我试图在展示我的UIAlertController
.
2019-04-26 11:40:42.140007+0100 MyAPP[12811:3974220] [LayoutConstraints] 无法同时满足约束。以下列表中的至少一个约束可能是您不想要的。试试这个:(1)查看每个约束并尝试找出您不期望的;(2) 找到添加了一个或多个不需要的约束的代码并修复它。( "" ) 将尝试通过打破约束来恢复 在 UIViewAlertForUnsatisfiableConstraints 处创建一个符号断点以在调试器中捕获它。中列出的 UIView 上的 UIConstraintBasedLayoutDebugging 类别中的方法也可能会有所帮助。
UIAlertController
我使用以下函数创建并呈现
@discardableResult
static func showOptionsModal(withOptions options:[String], sender:UIViewController ,holderView:UIView, arrowPosition:UIPopoverArrowDirection, completion: ((_ option:Int) -> ())?)->UIAlertController {
let moreActionsCellSheetController = UIAlertController(title:nil, message: nil,preferredStyle: .actionSheet)
for (i, option) in options.enumerated(){
let optionAction = UIAlertAction(title:option, style: .default){ (_) in
completion?(i)
}
moreActionsCellSheetController.addAction(optionAction)
}
if UIDevice.current.userInterfaceIdiom != .pad {
let actionCancel = UIAlertAction(title:printLocalized(withKey: "messages.cancel", targetSpecific: false), style: .destructive){ (_) in
completion?(-1)
}
moreActionsCellSheetController.addAction(actionCancel)
}
moreActionsCellSheetController.view.tintColor = UIColor.black
moreActionsCellSheetController.popoverPresentationController?.sourceView = holderView
moreActionsCellSheetController.popoverPresentationController?.sourceRect = holderView.frame
switch arrowPosition {
case .up:
moreActionsCellSheetController.popoverPresentationController?.sourceRect.origin.y = 0
moreActionsCellSheetController.popoverPresentationController?.sourceRect.origin.x = (-holderView.frame.width / 8)
moreActionsCellSheetController.popoverPresentationController?.permittedArrowDirections = .up
case .right:
moreActionsCellSheetController.popoverPresentationController?.sourceRect.origin.y = 0
moreActionsCellSheetController.popoverPresentationController?.sourceRect.origin.x = 0
moreActionsCellSheetController.popoverPresentationController?.permittedArrowDirections = .right
case .down:
moreActionsCellSheetController.popoverPresentationController?.sourceRect.origin.y = holderView.bounds.width/2
moreActionsCellSheetController.popoverPresentationController?.permittedArrowDirections = .down
case .left:
moreActionsCellSheetController.popoverPresentationController?.sourceRect.origin.y = holderView.bounds.height/2
moreActionsCellSheetController.popoverPresentationController?.permittedArrowDirections = .left
default:
moreActionsCellSheetController.popoverPresentationController?.sourceRect.origin.y = 0
moreActionsCellSheetController.popoverPresentationController?.sourceRect.origin.x = 0
moreActionsCellSheetController.popoverPresentationController?.permittedArrowDirections = .any
}
sender.present(moreActionsCellSheetController,animated: true, completion: nil)
return moreActionsCellSheetController
}
autolayoutTrace 显示以下结果:
•UIWindow:0x159d197b0 - AMBIGUOUS LAYOUT
| •UIView:0x159d3fbf0
| | *<UILayoutGuide: 0x2817eda40 - "UIViewSafeAreaLayoutGuide", layoutFrame = {{0, 44}, {375, 734}}, owningView = <UIView: 0x159d3fbf0; frame = (0 0; 375 812); autoresize = W+H; tintColor = UIExtendedSRGBColorSpace 0.176471 0.176471 0.176471 1; layer = <CALayer: 0x282ec41a0>>>
| | *UIView:0x159d367d0
| | | UILayoutContainerView:0x159d580b0
| | | | UINavigationTransitionView:0x159d5a760
| | | | | UIViewControllerWrapperView:0x159d4e880
| | | | | | •UIView:0x15b403b70
| | | | | | | *<UILayoutGuide: 0x2817fd5e0 - "UIViewSafeAreaLayoutGuide", layoutFrame = {{0, 0}, {375, 640}}, owningView = <UIView: 0x15b403b70; frame = (0 44; 375 640); autoresize = W+H; tintColor = UIExtendedSRGBColorSpace 0.176471 0.176471 0.176471 1; layer = <CALayer: 0x282e8ad20>>>
| | | | | | | *DAT_Air_Vinyl.MainLabel:0x15b503030'Select device to connect ...'
| | | | | | | *UIScrollView:0x15c014c00
| | | | | | | | *<_UIScrollViewContentOffsetGuide: 0x2817ecfc0 - "UIScrollView-contentOffsetLayoutGuide", layoutFrame = {{0, 0}, {0, 0}}, owningView = <UIScrollView: 0x15c014c00; frame = (0 0; 375 640); clipsToBounds = YES; hidden = YES; autoresize = RM+BM; gestureRecognizers = <NSArray: 0x282079e00>; layer = <CALayer: 0x282e8ce00>; contentOffset: {0, 0}; contentSize: {375, 746}; adjustedContentInset: {0, 0, 0, 0}>>
| | | | | | | | *DAT_Air_Vinyl.RecordHeaderView:0x15b503320
| | | | | | | | | *DAT_Air_Vinyl.RecordHeaderView:0x15b406010
| | | | | | | | | | *<UILayoutGuide: 0x2817e5a40 - "UIViewSafeAreaLayoutGuide", layoutFrame = {{0, 0}, {375, 150}}, owningView = <DAT_Air_Vinyl.RecordHeaderView: 0x15b406010; frame = (0 0; 375 150); clipsToBounds = YES; autoresize = RM+BM; layer = <CALayer: 0x282e8b120>>>
| | | | | | | | | | *UIView:0x15b406240
| | | | | | | | | | | *DAT_Air_Vinyl.MainButton:0x15b406420'Enable'
| | | | | | | | | | | | UIImageView:0x159d74e80
| | | | | | | | | | | | UIButtonLabel:0x15b406950'Enable'
| | | | | | | | | | | *DAT_Air_Vinyl.MainView:0x15b4070b0
| | | | | | | | | | | | *DAT_Air_Vinyl.MainLabel:0x15b4075f0'Gain:'
| | | | | | | | | | | | *DAT_Air_Vinyl.SelectorDropDownView:0x15b407ae0
| | | | | | | | | | | | | *UIImageView:0x15b604f90
| | | | | | | | | | | | | *DAT_Air_Vinyl.MainLabel:0x15b60aa20'0 dB'
| | | | | | | | | | | *DAT_Air_Vinyl.MainButton:0x15b4041a0'Clear all'
| | | | | | | | | | | | UIImageView:0x159d79740
| | | | | | | | | | | | UIButtonLabel:0x15b4046d0'Clear all'
| | | | | | | | | | *UIView:0x15b508ed0
| | | | | | | | | *UIView:0x15b50d250
| | | | | | | | *DAT_Air_Vinyl.MainTableView:0x15c025c00
| | | | | | | | | UIView:0x15b5084d0
| | | | | | | | | UIImageView:0x159d767c0
| | | | | | | | | UIImageView:0x159d769f0
| | | | | | | | UIImageView:0x159d76f70
| | | | | | | | UIImageView:0x159d76d40
| | | | | | | *_TtCC13DAT_Air_Vinyl20SelectorDropDownView12DropDownView:0x15b509420
| | | | | | | | *DAT_Air_Vinyl.MainTableView:0x15c026800
| | | | | | | | | UIView:0x15b50a210
| | | | | | | | | UIImageView:0x159d7a740
| | | | UINavigationBar:0x159d582b0
| | | | | _UIBarBackground:0x159d58770
| | | | | | UIImageView:0x159d58c00
| | | | | _UINavigationBarLargeTitleView:0x159d59880
| | | | | | UILabel:0x159d59dc0
| | | | | •_UINavigationBarContentView:0x159d59260
| | | | | | *<UILayoutGuide: 0x2817ee060 - "BackButtonGuide(0x159d59720)", layoutFrame = {{0, 0}, {8, 44}}, owningView = <_UINavigationBarContentView: 0x159d59260; frame = (0 0; 375 44); layer = <CALayer: 0x282eaea60>>>
| | | | | | *<UILayoutGuide: 0x2817ee140 - "LeadingBarGuide(0x159d59720)", layoutFrame = {{8, 0}, {0, 44}}, owningView = <_UINavigationBarContentView: 0x159d59260; frame = (0 0; 375 44); layer = <CALayer: 0x282eaea60>>>
| | | | | | *<UILayoutGuide: 0x2817ee220 - "TitleView(0x159d59720)", layoutFrame = {{8, 0}, {359, 44}}, owningView = <_UINavigationBarContentView: 0x159d59260; frame = (0 0; 375 44); layer = <CALayer: 0x282eaea60>>>
| | | | | | *<UILayoutGuide: 0x2817ee300 - "TrailingBarGuide(0x159d59720)", layoutFrame = {{367, 0}, {0, 44}}, owningView = <_UINavigationBarContentView: 0x159d59260; frame = (0 0; 375 44); layer = <CALayer: 0x282eaea60>>>
| | | | | | *<UILayoutGuide: 0x2817ee3e0 - "UIViewLayoutMarginsGuide", layoutFrame = {{16, 0}, {343, 44}}, owningView = <_UINavigationBarContentView: 0x159d59260; frame = (0 0; 375 44); layer = <CALayer: 0x282eaea60>>>
| | | | | | *<UILayoutGuide: 0x2817e5ce0 - "UIViewSafeAreaLayoutGuide", layoutFrame = {{0, 0}, {375, 44}}, owningView = <_UINavigationBarContentView: 0x159d59260; frame = (0 0; 375 44); layer = <CALayer: 0x282eaea60>>>
| | | | | | *_UITAMICAdaptorView:0x15b50e7a0
| | | | | | | DAT_Air_Vinyl.RecordViewNavigationBar:0x15b504370
| | | | | | | | UIImageView:0x15b50d430
| | | | | | | | DAT_Air_Vinyl.ScrollableTextView:0x15b50d660
| | | | | | | | | UIScrollView:0x15c017200
| | | | | | | | | | DAT_Air_Vinyl.MainLabel:0x15b50d8c0'DAT-Air WSS (95B6DC)'
| | | | | | | | | | DAT_Air_Vinyl.MainLabel:0x15b50dbb0'DAT-Air WSS (95B6DC)'
| | | | | | | | UIButton:0x15b50dea0
| | | | | | | | | UIImageView:0x159d773f0
| | | | | _UINavigationBarModernPromptView:0x159d5a0b0
| | *UIView:0x159d369b0
| | | *DAT_Air_Vinyl.MiniPlayerView:0x159d458c0
| | | | *<UILayoutGuide: 0x2817edb20 - "UIViewSafeAreaLayoutGuide", layoutFrame = {{0, 0}, {375, 1}}, owningView = <DAT_Air_Vinyl.MiniPlayerView: 0x159d458c0; frame = (0 0; 375 1); autoresize = W+H; gestureRecognizers = <NSArray: 0x2820829a0>; layer = <CALayer: 0x282eda960>>>
| | | | *UIImageView:0x159e0ec60
| | | | *DAT_Air_Vinyl.ScrollableTextView:0x159e10b20
| | | | | UIScrollView:0x15a828200
| | | | | | DAT_Air_Vinyl.MainLabel:0x159e10f80
| | | | | | DAT_Air_Vinyl.MainLabel:0x159d482b0
| | | | *UIButton:0x159d44cf0
| | | | | UIImageView:0x159d3ea10
| | | | *UIView:0x159d489a0
| | | | *UIView:0x159d48b80
| | *UITabBar:0x159d36b90
| | | _UIBarBackground:0x159d3ec60
| | | | UIImageView:0x159d3f390
| | | | UIVisualEffectView:0x159d3f5c0
| | | | | _UIVisualEffectBackdropView:0x159d47010
| | | | | _UIVisualEffectSubview:0x159d3c420
| | | | | _UIVisualEffectSubview:0x159d3da80
| | | UITabBarButton:0x159d404b0
| | | | UITabBarSwappableImageView:0x159d33330
| | | | UITabBarButtonLabel:0x159d407d0'Library'
| | | UITabBarButton:0x159d414f0
| | | | UITabBarSwappableImageView:0x159d41d10
| | | | UITabBarButtonLabel:0x159d419f0'Record'
| | | UITabBarButton:0x159d42840
| | | | UITabBarSwappableImageView:0x159d43060
| | | | UITabBarButtonLabel:0x159d42d40'Exports'
| | | UITabBarButton:0x159d43b90
| | | | UITabBarSwappableImageView:0x159d443b0
| | | | UITabBarButtonLabel:0x159d44090'Settings'
| +UITransitionView:0x15b1084e0- AMBIGUOUS LAYOUT for UITransitionView:0x15b1084e0.minX{id: 1503}, UITransitionView:0x15b1084e0.minY{id: 1480}, UITransitionView:0x15b1084e0.Width{id: 1608}, UITransitionView:0x15b1084e0.Height{id: 1481}
| | UIView:0x15b519280
| | *_UIKeyboardLayoutAlignmentView:0x15b518e50- AMBIGUOUS LAYOUT for _UIKeyboardLayoutAlignmentView:0x15b518e50.minY{id: 1478}
| | *_UIAlertControllerView:0x15d815e00- AMBIGUOUS LAYOUT for _UIAlertControllerView:0x15d815e00.minX{id: 1609}, _UIAlertControllerView:0x15d815e00.minY{id: 1610}, _UIAlertControllerView:0x15d815e00.Width{id: 1611}, _UIAlertControllerView:0x15d815e00.Height{id: 1612}
| | | *UIView:0x15b103200- AMBIGUOUS LAYOUT for UIView:0x15b103200.minX{id: 1582}, UIView:0x15b103200.minY{id: 1601}
| | | | *_UIAlertControllerInterfaceActionGroupView:0x15b510760- AMBIGUOUS LAYOUT for _UIAlertControllerInterfaceActionGroupView:0x15b510760.minX{id: 1522}
| | | | | *<_UIContentConstraintsLayoutGuide: 0x15b510c40 - "", layoutFrame = {{0, 0}, {39, 171.66666666666666}}, owningView = <_UIAlertControllerInterfaceActionGroupView: 0x15b510760; frame = (0 0; 0 0); opaque = NO; gestureRecognizers = <NSArray: 0x282061bf0>; layer = <CALayer: 0x282e8dde0>>>
| | | | | *UIView:0x15b510fb0
| | | | | | *_UIInterfaceActionGroupHeaderScrollView:0x15c035000
| | | | | | | *<_UIScrollViewContentOffsetGuide: 0x2817e6140 - "UIScrollView-contentOffsetLayoutGuide", layoutFrame = {{0, 0}, {0, 0}}, owningView = <_UIInterfaceActionGroupHeaderScrollView: 0x15c035000; frame = (0 0; 0 0); clipsToBounds = YES; gestureRecognizers = <NSArray: 0x282060ab0>; layer = <CALayer: 0x282ea68c0>; contentOffset: {0, 0}; contentSize: {0, 0}; adjustedContentInset: {0, 0, 0, 0}>>
| | | | | | | *UIView:0x15b515c10
| | | | | | | | *UIView:0x15b515df0- AMBIGUOUS LAYOUT for UIView:0x15b515df0.minX{id: 1580}, UIView:0x15b515df0.minY{id: 1812}, UIView:0x15b515df0.Height{id: 1813}
| | | | | | | | *UIView:0x15b515fd0- AMBIGUOUS LAYOUT for UIView:0x15b515fd0.minX{id: 1589}, UIView:0x15b515fd0.minY{id: 1814}, UIView:0x15b515fd0.Width{id: 1588}, UIView:0x15b515fd0.Height{id: 1815}
| | | | | | | | *UIView:0x15b5161b0- AMBIGUOUS LAYOUT for UIView:0x15b5161b0.minX{id: 1599}, UIView:0x15b5161b0.minY{id: 1816}
| | | | | | *groupView.actionsSequence...:0x15c032c00
| | | | | | | +actions-separatableSequen...:0x15b511550
| | | | | | | | •actions-separatableSequen...:0x15b511970
| | | | | | | | | *_UIInterfaceActionCustomViewRepresentationView:0x15b10cc30- AMBIGUOUS LAYOUT for _UIInterfaceActionCustomViewRepresentationView:0x15b10cc30.Height{id: 1650}
| | | | | | | | | | +_UIAlertControllerActionView:0x15b516e90
| | | | | | | | | | | *UIView:0x15b517370
| | | | | | | | | | | | *UILabel:0x15b517550'Show devices'
| | | | | | | | | *_UIInterfaceActionItemSeparatorView_iOS:0x15b60c530- AMBIGUOUS LAYOUT for _UIInterfaceActionItemSeparatorView_iOS:0x15b60c530.minY{id: 1725}
| | | | | | | | | | UIView:0x15b60c930
| | | | | | | | | | UIView:0x15b60cb10
| | | | | | | | | *_UIInterfaceActionCustomViewRepresentationView:0x15b60bda0- AMBIGUOUS LAYOUT for _UIInterfaceActionCustomViewRepresentationView:0x15b60bda0.minY{id: 1727}, _UIInterfaceActionCustomViewRepresentationView:0x15b60bda0.Height{id: 1700}
| | | | | | | | | | +_UIAlertControllerActionView:0x15b517840
| | | | | | | | | | | *UIView:0x15b517b20
| | | | | | | | | | | | *UILabel:0x15b517d00'Add device'
| | | | | | | | | *_UIInterfaceActionItemSeparatorView_iOS:0x15b60d3c0- AMBIGUOUS LAYOUT for _UIInterfaceActionItemSeparatorView_iOS:0x15b60d3c0.minY{id: 1729}
| | | | | | | | | | UIView:0x15b60d5c0
| | | | | | | | | | UIView:0x15b60d7a0
| | | | | | | | | *_UIInterfaceActionCustomViewRepresentationView:0x15b60bfe0- AMBIGUOUS LAYOUT for _UIInterfaceActionCustomViewRepresentationView:0x15b60bfe0.minY{id: 1723}, _UIInterfaceActionCustomViewRepresentationView:0x15b60bfe0.Height{id: 1653}
| | | | | | | | | | +_UIAlertControllerActionView:0x15b517ff0
| | | | | | | | | | | *UIView:0x15b5182d0
| | | | | | | | | | | | *UILabel:0x15b5184b0'Cancel'
| | | | | *_UIDimmingKnockoutBackdropView:0x15b512570
| | | | | | UIView:0x15b513340
| | | | | | UIVisualEffectView:0x15b512970
| | | | | | | _UIVisualEffectBackdropView:0x15b512f30
| | | | | | | _UIVisualEffectSubview:0x15b513140
约束问题似乎只发生在 iPhoneX 上。Ipad 和 iPhone 7 和 7 plus 没有显示该问题。
谢谢你。
解决方案
我在 iPad 中遇到了类似的问题。
我修复了它,删除了 sourceRect 并将 view.frame 更改为 CGRect(x, y, 0, 0)。
那么,如何moreActionsCellSheetController.popoverPresentationController?.sourceRect
在您的代码中删除呢?
sourceRect 表示 UIAlertController 的位置。所以我认为你最好将它设置为 CGRect。
谢谢。
推荐阅读
- java - 设置默认的 android 启动器 (ACTION_HOME_SETTINGS)
- java - 为统计信息收集去唯一的 SQL 查询,避免基数爆炸
- c# - Acumatica 多部分标识符无法绑定
- java - 使用递归卡在家谱上
- java - 在前台服务中获取 gps 坐标
- typescript - 匹配函数及其参数的 TypeScript 接口
- php - 发送 PHP 表单时,每次提交表单时从 PHP 变量列表中循环
- java - 在 janusgraph 中创建顶点时,什么可能导致“具有相同键的多个条目”错误?
- swift - SwiftUI 是否可以观察到传递给 EditMode 中的可选列表的“选择”变量的添加
- unix - 大写 Unix 中文本文件的第二列