SwiftUI ScrollView не прокручивается до текстового поля при визуализации UIViewRepresentableIOS

Программируем под IOS
Ответить Пред. темаСлед. тема
Anonymous
 SwiftUI ScrollView не прокручивается до текстового поля при визуализации UIViewRepresentable

Сообщение Anonymous »

В настоящее время я разрабатываю некоторые обновления наших представлений, и у нас есть представление, полностью созданное на SwiftUI. В этом представлении есть ScrollView, который до того, как мы вложили UIViewRepresentable, использовался для прокрутки до TextField, когда это поле было в фокусе.
struct PinDetailViewSwiftUI {

var body: some View {

ScrollView {
VStack(spacing: 0) {
GeometryReader { proxy in
let offset = proxy.frame(in: .named("scroll")).minY
Color(GrayColors.gray10.getColor()).preference(key: ViewOffsetKey.self, value: offset)
}

if pinViewModel.isLoadingData {
PinDetailLoadingViewSwiftUI()
} else {
PinSectionHeaderView(title: DTTaskListTranslate.splitViewTasks.translation)
if !pinViewModel.tasks.isEmpty || pinViewModel.tasksHasChanged {

NavigationLink(destination: PinTaskDetailSwiftUI(tasks: .constant(pinViewModel.tasks), selectedTask: pinViewModel.preSelectedTask, pin: pinViewModel.pinModel, userRole: project.roleType ?? .SubContractor, viewMode: .view, reassign: false), isActive: $pinViewModel.openPreSelectedTask) {
EmptyView()
}.buttonStyle(PlainButtonStyle())

SwiftUI.Group {
TaskPreviewRepresentable(task: pinViewModel.tasks[0], userImage: .constant(nil), userRole: project.roleType ?? .SubContractor, viewModel: viewModel)
.frame(height: viewModel.getHeightOfTaskPreview(task: task, userRole: project.roleType ?? .SubContractor), alignment: .center)
}
.animation(.easeInOut)
}

if pinViewModel.pinModel != nil && pinViewModel.userCanCreateTasks() {
NavigationLink(isActive: $pinViewModel.showTaskCreationView) {
PinTaskDetailSwiftUI(tasks: $pinViewModel.tasks, selectedTask: DTMediaPost.getDefaultTask(pin: pinViewModel.pinModel), pin: pinViewModel.pinModel, userRole: project.roleType ?? .SubContractor, viewMode: .create, reassign: false)
} label: {
Button(action: {
if !pin.isPinClosedOrInactive {
pinViewModel.showTaskCreationView.toggle()
} else {
pinViewModel.showPinClosedAlert.toggle()
}
}, label: {
PinCreateNewTask()
})
}
.frame(height: 50)
}

PinSectionHeaderView(title: DTPinTranslate.pinFieldsHeader.translation)

if !pinViewModel.datasets.isEmpty {
PinDatasetView(linkedDatasets: $pinViewModel.linkedRecords, records: $pinViewModel.datasets, datasetChanged: $pinViewModel.datasetChanged, showPinClosedAlert: $pinViewModel.showPinClosedAlert, pin: pinViewModel.pinModel)

Rectangle()
.frame(maxWidth: .infinity)
.frame(height: 1)
.foregroundColor(.gray.opacity(0.2))
.padding([.bottom, .top], 8)
}

if !pinViewModel.pinFields.isEmpty {

SwiftUI.Group {
ForEach(pinViewModel.pinFields, id: \.id!) { value in
switch value.type! {
case .number:
PinTextFieldView(pinModel: $pinViewModel.pinModel, numberPinField: value as! DTNumberPinField, canEdit: pinViewModel.pinModel.canPinBeChanged)
case .date:
PinDateView(pin: $pinViewModel.pinModel, dtPinDateField: value as! DTPinDateField, canEdit: pinViewModel.pinModel.canPinBeChanged)
case .slider:
PinSliderView(pinSliderScale: value as! DTPinSliderField, pinModel: $pinViewModel.pinModel, categoryColor: $pinViewModel.pinCategoryColor, canEdit: pinViewModel.pinModel.canPinBeChanged)
case .text:
PinTextAreaView(textPinField: value as! DTTextPinField, canEdit: pinViewModel.pinModel.canPinBeChanged, pinModel: $pinViewModel.pinModel)
case .tags:
VStack {
if showTagSuggestions {
PinTagSuggestionView(suggestedTags: $pinViewModel.suggestedTags, recentTags: $pinViewModel.filteredRecentTags, searchedTag: $pinViewModel.currentTagBeingAdded)
.frame(height: pinViewModel.getRecentTagsHeight())
}
PinTagsView(showTagSuggestions: $showTagSuggestions, currentTagBeingAdded: $pinViewModel.currentTagBeingAdded, canBeEdited: pinViewModel.pinModel.canPinBeChanged, tagField: value, pin: $pinViewModel.pinModel)
}

case .time:
PinTimeFieldView(pinModel: $pinViewModel.pinModel, timePinField: value as! DTPinTimeField)
}

Rectangle()
.frame(maxWidth: .infinity)
.frame(height: 1)
.foregroundColor(.gray.opacity(0.2))
.padding([.bottom, .top], 8)
}
}
}

if !pinViewModel.visualMediaPosts.isEmpty, !isCameraOpened {
PinMediaView(medias: $pinViewModel.visualMediaPosts, pin: pinViewModel.pinModel, numberOfMedias: pinViewModel.numberOfElementsInPin())
.frame(height: pinViewModel.getTotalHeightForMediaSection())
}

if !pinViewModel.mediaPosts.isEmpty,
!isCameraOpened {
PinSectionHeaderView(title: DTSharedTranslate.activity.translation)

if #available(iOS 16.0, *) {
PinActivityViewList(mediaPosts: pinViewModel.mediaPosts, pin: pinViewModel.pinModel, isLastPage: pinViewModel.isLastPage, pinDetailViewModel: .constant(pinViewModel), isLoading: pinViewModel.isLoadingMedia, loadNextPage: $pinViewModel.loadNextPage)
.frame(height: pinViewModel.getTotalHeightForActivitySection())
.animation(.easeInOut)
.scrollContentBackground(.hidden)
} else {
PinActivityViewList(mediaPosts: pinViewModel.mediaPosts, pin: pinViewModel.pinModel, isLastPage: pinViewModel.isLastPage, pinDetailViewModel: .constant(pinViewModel), isLoading: pinViewModel.isLoadingMedia, loadNextPage: $pinViewModel.loadNextPage)
.frame(height: pinViewModel.getTotalHeightForActivitySection())
.animation(.easeInOut)

}
}
}
}
.background(Color.white)
.navigationBarHidden(true)
}
.background(Color(GrayColors.gray10.getColor()))
.coordinateSpace(name: "scroll")
.onPreferenceChange(ViewOffsetKey.self) { value in
if pinViewModel.galleryViewHeight >= 0.0 && pinViewModel.galleryViewHeight DTTaskPreview {

let taskPreview = DTTaskPreview(frame: .init(x: 0, y: 0, width: UIDevice.isiPad ? viewModel.pinDetailiPadWidth - 32 : UIScreen.main.bounds.width - 32, height: self.viewModel.getHeightOfTaskPreview(task: task, userRole: userRole)))

taskPreview.setupTaskStatus(taskStatus: NewTaskStatus(dtMediaPost: task))
taskPreview.setTaskStatusLabel(value: NewTaskStatus(dtMediaPost: task).getName().lowercased())
taskPreview.setTaskNumber(value: DTTaskListTranslate.taskListNumber.translation+" "+(task.number.unwrapped == 0 ? "-" : String(task.number.unwrapped)))
taskPreview.setTaskDescription(value: task.title.unwrapped)
taskPreview.setTaskCreatedOrLastModified(value: viewModel.getLastModifiedString(task: task))
taskPreview.setAssigneeImage(image: viewModel.userImage, placeholder: task.getAssigneePlaceholder)

var mainAction: TaskQuickAction?
var secondaryAction: TaskQuickAction?
(secondaryAction, mainAction) = viewModel.getMainAndSecondaryAction(userRole: userRole, task: task)

if let leftAction = secondaryAction {
taskPreview.setLeftButton(buttonSize: .medium, buttonStyle: .tertiary)
taskPreview.setActionForLeftButton(actionName: leftAction.getOptionTranslation(), quickAction: leftAction)
} else {
taskPreview.hideLeftButton(hidden: true)
}

if let mainAction = mainAction {
taskPreview.setRightButton(buttonSize: .medium, buttonStyle: .callToAction)
taskPreview.setActionForRightButton(actionName: mainAction.getOptionTranslation(), quickAction: mainAction)
} else {
taskPreview.hideRightButton(hidden: true)
}
taskPreview.hideButtonView(hidden: (mainAction == nil && secondaryAction == nil))

taskPreview.setAssigneeName(value: task.assignment?.name ?? "")
taskPreview.setAssigneeSecondLine(value: viewModel.getAssigneeSecondLineString(task: task))
taskPreview.setDueDateLabel(value: task.due)
taskPreview.delegate = viewModel

return taskPreview
}

func updateUIView(_ uiView: DTTaskPreview, context: Context) {
uiView.setAssigneeImage(image: viewModel.userImage, placeholder: task.getAssigneePlaceholder)
}

}



Подробнее здесь: https://stackoverflow.com/questions/786 ... ble-is-ren
Реклама
Ответить Пред. темаСлед. тема

Быстрый ответ

Изменение регистра текста: 
Смайлики
:) :( :oops: :roll: :wink: :muza: :clever: :sorry: :angel: :read: *x)
Ещё смайлики…
   
К этому ответу прикреплено по крайней мере одно вложение.

Если вы не хотите добавлять вложения, оставьте поля пустыми.

Максимально разрешённый размер вложения: 15 МБ.

  • Похожие темы
    Ответы
    Просмотры
    Последнее сообщение

Вернуться в «IOS»