问题描述
在 SwiftUI 中使用新的 (iOS 14) DatePicker,它按预期工作并且在模拟器和设备上看起来不错,但是一旦日历弹出,我在输出窗口中收到几行警告.这有点有点烦人!
虽然日志贴在下面,但看似相关的内容似乎是:
1'255'000
1125000
但是,正如下面的代码所示,我不限制任何小于 300 点的内容。而且,一切正常。
从我的角度来看,两种解决方案中的任何一种都可以正常工作:
- 禁止所有警告,或
- 向代码添加任何修复以消除警告
弹出日期选择器的代码,一旦点击控件就会生成所有警告:
UIDatePicker 0x7fbd66fc49f0 is being laid out below its minimum width of 280. This may not look like expected,especially with larger than normal font sizes.
这个 struct MyCustomDatePicker : View {
var doSomething : (Date) -> ()
@State var title: String
@State var ignoreSelStart : Bool
@State var ignoreSelEnd : Bool
@State var selectedDate : Date
@ObservedObject var limits : DateRangeLimits
var body: some View {
VStack {
DatePicker(
"\(title)",selection: $selectedDate,in: ((ignoreSelStart ? limits.hardStart : limits.selectedStart)...(ignoreSelEnd ? limits.hardEnd : limits.selectedEnd)),displayedComponents: [.date]
)
.onChange(of: selectedDate,perform: { value in
doSomething(selectedDate)
})
}
.frame(width: 400,height: 100,alignment: .center)
.background(Color.white)
}
}
是从这里调用的:
struct
警告的第一位:
struct FlexChoice : View {
@ObservedObject var limits = DateRangeLimits()
func setStart(d: Date) {
// stuff
}
func setEnd(d: Date) {
// stuff
}
var body: some View {
VStack(spacing: 0) {
if customDateRangePossible {
HStack {
MyCustomDatePicker(doSomething: self.setStart,title: "Begin ",ignoreSelStart: true,ignoreSelEnd: false,selectedDate: limits.selectedStart,limits: limits)
MyCustomDatePicker(doSomething: self.setEnd,title: "Finish ",ignoreSelStart: false,ignoreSelEnd: true,selectedDate: limits.selectedEnd,limits: limits)
} // closes HStack
} // closes "if customDateRangePossible..."
} // closes VStack
} // closes body
} // closes struct
接下来是多次重复基本相同的警告(减去在每次连续迭代中刚刚打破的约束)。
在数百行警告的最后:
2021-01-23 10:06:35.707334-0600 MyAppName[28362:46367754] [LayoutConstraints] 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.
(
"<_UISystemBaselineConstraint:0x6000011979d0 H:[_UIDatePickerLinkedLabel:0x7fbd66ffda10]-(NSLayoutAnchorConstraintSpace(8))-[UILayoutGuide:0x6000008f4540''] (active)>","<_UISystemBaselineConstraint:0x600001196f30 H:[UILayoutGuide:0x6000008f4540'']-(>=NSLayoutAnchorConstraintSpace(8))-[_UIDatePickerTouchOutsetButton:0x7fbd66f8e9d0] (active)>","<NSLayoutConstraint:0x600001197070 _UIDatePickerLinkedLabel:0x7fbd66ffda10.leading == UILayoutGuide:0x6000008f41c0'UIViewLayoutMarginsGuide'.leading (active)>","<NSLayoutConstraint:0x600001194fa0 H:[_UIDatePickerTouchOutsetButton:0x7fbd66f8e9d0]-(28)-[_UIDatePickerTouchOutsetButton:0x7fbd72922e40] (active)>","<NSLayoutConstraint:0x600001197340 _UIDatePickerTouchOutsetButton:0x7fbd72922e40.trailing == UILayoutGuide:0x6000008f41c0'UIViewLayoutMarginsGuide'.trailing (active)>","<NSLayoutConstraint:0x6000011975c0 UILayoutGuide:0x6000008f4540''.width == UIImageView:0x7fbd66f8e800.width (active)>","<NSLayoutConstraint:0x60000125fca0 _UIDatePickerCalendarContentStackView:0x7fbd66f8ad40.width <= _UIDatePickerCalendarView:0x7fbd66fc49f0.width (active)>","<NSLayoutConstraint:0x6000011c2f30 H:|-(0)-[_UIDatePickerCalendarView:0x7fbd66fc49f0] (active,names: '|':UIDatePicker:0x7fbd7298e840 )>","<NSLayoutConstraint:0x6000011c0500 _UIDatePickerCalendarView:0x7fbd66fc49f0.trailing == UIDatePicker:0x7fbd7298e840.trailing (active)>","<NSLayoutConstraint:0x60000125ee90 H:|-(8)-[UIDatePicker:0x7fbd7298e840] (active,names: '|':UIView:0x7fbd72d46870 )>","<NSLayoutConstraint:0x6000012573e0 UIDatePicker:0x7fbd7298e840.trailing == UIView:0x7fbd72d46870.trailing - 8 (active)>","<NSLayoutConstraint:0x6000011de120 'UISV-canvas-connection' _UIDatePickerCalendarContentStackView:0x7fbd66f8ad40.leading == _UIDatePickerCalendarHeaderView:0x7fbd66f8aed0.leading (active)>","<NSLayoutConstraint:0x6000011df390 'UISV-canvas-connection' H:[_UIDatePickerCalendarHeaderView:0x7fbd66f8aed0]-(0)-| (active,names: '|':_UIDatePickerCalendarContentStackView:0x7fbd66f8ad40 )>","<NSLayoutConstraint:0x6000011cfca0 'UIView-Encapsulated-Layout-Width' UIView:0x7fbd72d46870.width == 0 (active)>","<NSLayoutConstraint:0x60000119cd20 'UIView-leftMargin-guide-constraint' H:|-(8)-[UILayoutGuide:0x6000008f41c0'UIViewLayoutMarginsGuide'](LTR) (active,names: '|':_UIDatePickerCalendarHeaderView:0x7fbd66f8aed0 )>","<NSLayoutConstraint:0x6000011977a0 'UIView-rightMargin-guide-constraint' H:[UILayoutGuide:0x6000008f41c0'UIViewLayoutMarginsGuide']-(8)-|(LTR) (active,names: '|':_UIDatePickerCalendarHeaderView:0x7fbd66f8aed0 )>"
)
Will attempt to recover by breaking constraint
<_UISystemBaselineConstraint:0x600001196f30 H:[UILayoutGuide:0x6000008f4540'']-(>=NSLayoutAnchorConstraintSpace(8))-[_UIDatePickerTouchOutsetButton:0x7fbd66f8e9d0] (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.
有没有办法让 DatePicker 开心并让这些警告不会淹没输出窗口,无论是通过修复问题还是抑制警告?
解决方法
暂无找到可以解决该程序问题的有效方法,小编努力寻找整理中!
如果你已经找到好的解决方法,欢迎将解决方案带上本链接一起发送给小编。
小编邮箱:dio#foxmail.com (将#修改为@)