.Clipped() не работает на сборщиках SwiftUI

#ios #xcode #datepicker #swiftui #picker

#iOS #xcode #datepicker #swiftui #сборщик

Вопрос:

Мне нужно создать представление, в котором есть 2 Pickers и 2 DatePickers .

Чтобы избежать их наложения друг на друга, я использовал .clipped() . Однако это не работает.

Я могу успешно изменить размер pickers , но я не могу ограничить «область выделения» их frame размером.

Вот мой код:

 VStack(spacing: 10) {
        Picker(selection: self.$dayTypeSelectedIndex, label: Text("")) {
            ForEach(0 ..< self.dayTypes.count, id: .self) {
                Text(self.dayTypes[$0])
                    .foregroundColor(Color.black)
            }
        }
        .pickerStyle(SegmentedPickerStyle())
        .labelsHidden()
        .clipped()
        
        Spacer()
        
        Group {
            DatePicker("", selection: self.$dateIntervalStart, displayedComponents: .hourAndMinute)
                .labelsHidden()
                .colorInvert()
                .colorMultiply(Color.black)
                .frame(maxHeight: 50)
                .clipped()
            
            Spacer()
            
            Text("às")
                .foregroundColor(Color.black)
            
            Spacer()
            
            DatePicker("", selection: self.$dateIntervalEnd, displayedComponents: .hourAndMinute)
                .labelsHidden()
                .colorInvert()
                .colorMultiply(Color.black)
                .frame(maxHeight: 50)
                .clipped()
        }
        
        Spacer()
        
        HStack {
            Picker(selection: self.$tripNotificationDelta, label: Text("")) {
                ForEach(0...60, id: .self) {
                    Text($0 < 10 ? "0($0)" : "($0)")
                        .foregroundColor(Color.black)
                }
            }
            .labelsHidden()
            .frame(maxWidth: 50, maxHeight: 50)
            .clipped()

            Text("mins before trip")
                .foregroundColor(Color.black)
        }
    }
}
  

Что я делаю не так?

Я использую XCode 12. Кроме того, этот интерфейс создается для устройств, не работающих под управлением iOS 14.

Спасибо!

Ответ №1:

Итак, я понял это. Просто поставьте .compositingGroup() перед .clipped() . Что-то вроде этого:

             DatePicker("", selection: self.$dateIntervalEnd, displayedComponents: .hourAndMinute)
            .labelsHidden()
            .colorInvert()
            .colorMultiply(Color.black)
            .frame(maxHeight: 50)
            .compositingGroup()
            .clipped()
  

Комментарии:

1. Это исправление также сработало для меня для обрезки изображений в iOS 14

2. Отличная находка. Спасибо!!!

Ответ №2:

Как упоминалось здесь

Добавление этого простого расширения решает проблему с перекрывающимися областями прокрутки. Вам не нужно добавлять .compositingGroup() и .clipped()

 extension UIPickerView {
override open var intrinsicContentSize: CGSize {
    return CGSize(width: UIView.noIntrinsicMetric, height: super.intrinsicContentSize.height)
}
}