Открываемое изображение в ZStack с помощью кнопки

#button #swiftui #zstack

#кнопка #swiftui #zstack

Вопрос:

У меня есть ZStack изображение с изображением и кнопкой закрытия, накладывающейся на него. Я не могу сделать изображение открываемым с помощью кнопки, накладывающей его.

           ZStack(alignment: .topTrailing) {
                NetworkImage(url: article.imageURL)
                    .aspectRatio(contentMode: .fill)
                    .frame(width: UIScreen.main.bounds.width,
                           height: UIScreen.main.bounds.height * 0.5)
                    .scaleEffect(scrollViewContentOffset < 0 ?
                                    1   (-scrollViewContentOffset * 0.005)
                                    : 1,
                                 anchor: .bottom)
                
                Button(action: {
                    self.presentationMode.wrappedValue.dismiss()
                }){
                    Image(systemName: "xmark.circle.fill")
                        .foregroundColor(.init(white: 0.9)).padding([.top, .trailing])
                        .font(.system(size: topCloseButtonSize))
                        .offset(y: scrollViewContentOffset < 0 ?
                                    .extraLarge   scrollViewContentOffset :
                                    .extraLarge)
                }
            }
  

Я попытался добавить жест касания к самому изображению, но это отключает возможность нажатия на кнопку закрытия. Как я могу поддерживать ZStack в такте и иметь возможность нажимать как изображение, так и кнопку закрытия?введите описание изображения здесь

Ответ №1:

Попробуйте добавить onTapGesture модификатор к изображению сети (прямоугольник в коде beloew) — тогда, похоже, все работает так, как ожидалось. Я упростил сетевое изображение, чтобы использовать стандартный прямоугольник, но результаты нажатия должны быть одинаковыми. Протестировано на Xcode 12.1.

     ZStack(alignment: .topTrailing) {
        Rectangle()  // Use NetworkImage here - simplified to Rectangle for testing
            .aspectRatio(contentMode: .fill)
            .frame(width: UIScreen.main.bounds.width,
                   height: UIScreen.main.bounds.height * 0.5)
            .onTapGesture(count: 1, perform: {
                print("RECTANGLE TAPPED!")
            })
        Button(action: {
            print("CLOSE TAPPED")
        }){
            Image(systemName: "xmark.circle.fill")
                .foregroundColor(.init(white: 0.9)).padding([.top, .trailing])
        }
    }
  

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

1. Это решение, которое я тоже пробовал. Я больше не могу нажимать на кнопку с этим решением.

2. Я предлагаю вам добавить больше кода к вашему примеру — проблема может быть связана с используемым вами классом NetworkImage или модификаторами смещения / масштаба, которые вы применяете. Я не могу запустить код, который вы опубликовали выше, поскольку есть несколько неизвестных ссылок. Если вы запустите упрощенный пример кода в ответе, который я опубликовал выше, он достигнет вашей цели.