Uiview PageViewController-白色背景

Uiview PageViewController-白色背景,uiview,uiviewcontroller,swiftui,Uiview,Uiviewcontroller,Swiftui,我正在尝试对由PageViewController表示的卡应用.background修改器 红色背景不适用于我的卡,因为该卡似乎有默认的白色背景 这里有什么问题? 非常感谢。默认情况下,您的UIHostingController会为每一张确切的卡设置背景。您可以将背景颜色设置为。手动清除可使SwiftUI背景生效: struct PageView<Page:View>: View { var viewControllers: [UIHostingController<

我正在尝试对由PageViewController表示的卡应用.background修改器

红色背景不适用于我的卡,因为该卡似乎有默认的白色背景

这里有什么问题?
非常感谢。

默认情况下,您的UIHostingController会为每一张确切的卡设置背景。您可以将背景颜色设置为。手动清除可使SwiftUI背景生效:

struct PageView<Page:View>: View {

    var viewControllers: [UIHostingController<Page>]

    init(_ views: [Page]) {
        self.viewControllers = views.map { UIHostingController(rootView: $0)}
        for viewController in viewControllers{
            viewController.view.backgroundColor = .clear
        }

    }
...
}
struct页面视图:视图{
var viewControllers:[UIHostingController]
初始化(uu视图:[页面]){
self.viewControllers=views.map{UIHostingController(rootView:$0)}
对于viewController中的viewController{
viewController.view.backgroundColor=.clear
}
}
...
}

检查我的完整
SwiftUI
实现
UIPageViewController
。它不使用
UIKit
,因此更易于控制

import SwiftUI
extension OnboardingCard{
    static var test: [OnboardingCard]{
        [
        OnboardingCard(image: "onboarding", title: "Card 1", description: "Card 1 description."),
        OnboardingCard(image: "onboarding", title: "Card 2", description: "Card 2 description."),
        OnboardingCard(image: "onboarding", title: "Card 3", description: "Card 4 description.")
        ]
    }
}

struct ContentView: View {
    var directionForward = true
    @State var currentCard: OnboardingCard
    var cards: [OnboardingCard]
    @State var xOffset: CGFloat = 0
    init(cards newCards: [OnboardingCard]){
        self.cards = newCards
        guard let startCard = newCards.first else {fatalError("no cards")}
        self._currentCard = State(initialValue: startCard)
    }
    var body: some View {
        GeometryReader{geometry in
            HStack{
                ForEach(self.cardsSorted()){card in
                    OnboardingCardView(card: card)
                        .frame(width: geometry.size.width)
                }
            }
            .offset(x: self.xOffset, y: 0)
            .gesture(DragGesture()
            .onChanged(){value in
                self.xOffset = value.location.x - value.startLocation.x
                }
            .onEnded(){value in
                let inPercent = 100 * self.xOffset / (geometry.size.width / 2)
                let changedCount = inPercent / 100
                if changedCount < -1{//drag left to go to next one
                    guard let currentCardInd = self.cards.firstIndex(where: {$0.id == self.currentCard.id}) else{fatalError("cant find current card")}
                    let nextInd = self.cards.index(currentCardInd, offsetBy: Int(-changedCount))
                    if self.cards.indices.contains(nextInd){
                        self.currentCard = self.cards[nextInd]
                        self.xOffset = geometry.size.width + self.xOffset
                    }else{
                        guard let firstCard = self.cards.first else{fatalError("cant get first card")}
                        self.currentCard = firstCard
                        self.xOffset = geometry.size.width + self.xOffset
                    }
                }else if changedCount > 1{//drag right to go to previos one
                    guard let currentCardInd = self.cards.firstIndex(where: {$0.id == self.currentCard.id}) else{fatalError("cant find current card")}
                    let previosInd = self.cards.index(currentCardInd, offsetBy: Int(-changedCount))
                    if self.cards.indices.contains(previosInd){
                        self.currentCard = self.cards[previosInd]
                        self.xOffset = -geometry.size.width + self.xOffset
                    }else{
                        guard let lastCard = self.cards.last else{fatalError("cant get last card")}
                        self.currentCard = lastCard
                        self.xOffset = -geometry.size.width + self.xOffset
                    }
                }

                withAnimation(.easeInOut(duration: 0.5)){
                    self.xOffset = 0
                }
            })
        }
    }
    func cardsSorted() -> [OnboardingCard]{
        guard let currentCardInd = self.cards.firstIndex(where: {$0.id == self.currentCard.id}) else{fatalError("cant find current card")}
        guard let firstInd = self.cards.firstIndex(where: {$0.id == cards.first?.id}) else{fatalError("cant find current card")}
        guard let lastInd = self.cards.firstIndex(where: {$0.id == cards.last?.id}) else{fatalError("cant find current card")}
        var nextInd = self.cards.index(after: currentCardInd)
        if self.cards.indices.contains(nextInd) == false{
            nextInd = firstInd
        }
        var previosInd = self.cards.index(before: currentCardInd)
        if self.cards.indices.contains(previosInd) == false{
            previosInd = lastInd
        }
        return [self.cards[previosInd], self.cards[currentCardInd],self.cards[nextInd]]
    }
}

struct ContentView_Previews: PreviewProvider {
    static var previews: some View {
        ContentView(cards: OnboardingCard.test)
    }
}
导入快捷界面
分机登机卡{
静态var测试:[车载卡]{
[
登机卡(图像:“登机”,标题:“卡1”,说明:“卡1说明”),
登机卡(图像:“登机”,标题:“卡2”,说明:“卡2说明”),
登机卡(图像:“登机”,标题:“卡3”,说明:“卡4说明”)
]
}
}
结构ContentView:View{
var directionForward=true
@状态变量当前卡:车载卡
var卡:[车载卡]
@状态变量xOffset:CGFloat=0
初始化(新卡:[车载卡]){
self.cards=新卡
guard let startCard=newCards.first-else{fatalError(“无卡”)}
self.\u currentCard=状态(初始值:startCard)
}
var body:一些观点{
GeometryReader{中的几何体
HStack{
ForEach(self.cardsorted()){card-in
车载卡视图(卡:卡)
.框架(宽度:几何尺寸宽度)
}
}
.offset(x:self.xOffset,y:0)
.手势(DragGesture()
.onChanged(){中的值
self.xOffset=value.location.x-value.startLocation.x
}
.onEnded(){中的值
设输入百分比=100*self.xOffset/(geometry.size.width/2)
让changedCount=inPercent/100
如果changedCount<-1{//向左拖动以转到下一个
guard let currentCardInd=self.cards.firstIndex(其中:{$0.id==self.currentCard.id})else{fatalError(“找不到当前卡”)}
设nextInd=self.cards.index(currentCardInd,offsetBy:Int(-changedCount))
如果self.cards.index.contains(nextInd){
self.currentCard=self.cards[nextInd]
self.xOffset=geometry.size.width+self.xOffset
}否则{
guard let firstCard=self.cards.first-else{fatalError(“无法获得第一张卡”)}
self.currentCard=firstCard
self.xOffset=geometry.size.width+self.xOffset
}
}否则,如果changedCount>1{//则向右拖动以转到previos one
guard let currentCardInd=self.cards.firstIndex(其中:{$0.id==self.currentCard.id})else{fatalError(“找不到当前卡”)}
让previosInd=self.cards.index(currentCardInd,offsetBy:Int(-changedCount))
如果self.cards.index.contains(previosInd){
self.currentCard=self.cards[previosInd]
self.xOffset=-geometry.size.width+self.xOffset
}否则{
guard let lastCard=self.cards.last else{fatalError(“无法获取最后一张卡”)}
self.currentCard=lastCard
self.xOffset=-geometry.size.width+self.xOffset
}
}
带动画(.easeInOut(持续时间:0.5)){
self.xOffset=0
}
})
}
}
func Cardsorted()->[车载卡]{
guard let currentCardInd=self.cards.firstIndex(其中:{$0.id==self.currentCard.id})else{fatalError(“找不到当前卡”)}
guard let firstInd=self.cards.firstIndex(其中:{$0.id==cards.first?.id})else{fatalError(“找不到当前卡”)}
guard let lastInd=self.cards.firstIndex(其中:{$0.id==cards.last?.id})else{fatalError(“找不到当前卡”)}
var nextInd=self.cards.index(在:currentCardInd之后)
如果self.cards.index.contains(nextInd)=false{
nextInd=firstInd
}
var previosInd=self.cards.index(在:currentCardInd之前)
如果self.cards.index.contains(previosInd)=false{
previosInd=lastInd
}
返回[self.cards[previosInd],self.cards[currentCardInd],self.cards[nextInd]]
}
}
结构内容视图\u预览:PreviewProvider{
静态var预览:一些视图{
ContentView(卡片:OnboardingCard.test)
}
}

它的代码更少,逻辑也更透明。如果需要,您可以修改检查以调整开关灵敏度(通过编辑compare
if changedCount>1
)。您可以使用手势端点预测来计算和调整动画速度,甚至可以一次切换多张卡。这完全取决于你。或者您可以按原样使用。

谢谢您的回答@Aspid。我不在PageViewController中设置背景。我添加了代码以便您更好地理解。我仍然对这个问题耿耿于怀,我想了解发生了什么。更深入地了解
UIPageViewController
?感谢您的帮助,这是我的完整代码项目示例:问题在UIPageViewController中。默认情况下,它不是透明的。检查这个问题是否有帮助:非常感谢!没有UIKit肯定会更好。我
struct PageView<Page:View>: View {

    var viewControllers: [UIHostingController<Page>]

    init(_ views: [Page]) {
        self.viewControllers = views.map { UIHostingController(rootView: $0)}
        for viewController in viewControllers{
            viewController.view.backgroundColor = .clear
        }

    }
...
}
import SwiftUI
extension OnboardingCard{
    static var test: [OnboardingCard]{
        [
        OnboardingCard(image: "onboarding", title: "Card 1", description: "Card 1 description."),
        OnboardingCard(image: "onboarding", title: "Card 2", description: "Card 2 description."),
        OnboardingCard(image: "onboarding", title: "Card 3", description: "Card 4 description.")
        ]
    }
}

struct ContentView: View {
    var directionForward = true
    @State var currentCard: OnboardingCard
    var cards: [OnboardingCard]
    @State var xOffset: CGFloat = 0
    init(cards newCards: [OnboardingCard]){
        self.cards = newCards
        guard let startCard = newCards.first else {fatalError("no cards")}
        self._currentCard = State(initialValue: startCard)
    }
    var body: some View {
        GeometryReader{geometry in
            HStack{
                ForEach(self.cardsSorted()){card in
                    OnboardingCardView(card: card)
                        .frame(width: geometry.size.width)
                }
            }
            .offset(x: self.xOffset, y: 0)
            .gesture(DragGesture()
            .onChanged(){value in
                self.xOffset = value.location.x - value.startLocation.x
                }
            .onEnded(){value in
                let inPercent = 100 * self.xOffset / (geometry.size.width / 2)
                let changedCount = inPercent / 100
                if changedCount < -1{//drag left to go to next one
                    guard let currentCardInd = self.cards.firstIndex(where: {$0.id == self.currentCard.id}) else{fatalError("cant find current card")}
                    let nextInd = self.cards.index(currentCardInd, offsetBy: Int(-changedCount))
                    if self.cards.indices.contains(nextInd){
                        self.currentCard = self.cards[nextInd]
                        self.xOffset = geometry.size.width + self.xOffset
                    }else{
                        guard let firstCard = self.cards.first else{fatalError("cant get first card")}
                        self.currentCard = firstCard
                        self.xOffset = geometry.size.width + self.xOffset
                    }
                }else if changedCount > 1{//drag right to go to previos one
                    guard let currentCardInd = self.cards.firstIndex(where: {$0.id == self.currentCard.id}) else{fatalError("cant find current card")}
                    let previosInd = self.cards.index(currentCardInd, offsetBy: Int(-changedCount))
                    if self.cards.indices.contains(previosInd){
                        self.currentCard = self.cards[previosInd]
                        self.xOffset = -geometry.size.width + self.xOffset
                    }else{
                        guard let lastCard = self.cards.last else{fatalError("cant get last card")}
                        self.currentCard = lastCard
                        self.xOffset = -geometry.size.width + self.xOffset
                    }
                }

                withAnimation(.easeInOut(duration: 0.5)){
                    self.xOffset = 0
                }
            })
        }
    }
    func cardsSorted() -> [OnboardingCard]{
        guard let currentCardInd = self.cards.firstIndex(where: {$0.id == self.currentCard.id}) else{fatalError("cant find current card")}
        guard let firstInd = self.cards.firstIndex(where: {$0.id == cards.first?.id}) else{fatalError("cant find current card")}
        guard let lastInd = self.cards.firstIndex(where: {$0.id == cards.last?.id}) else{fatalError("cant find current card")}
        var nextInd = self.cards.index(after: currentCardInd)
        if self.cards.indices.contains(nextInd) == false{
            nextInd = firstInd
        }
        var previosInd = self.cards.index(before: currentCardInd)
        if self.cards.indices.contains(previosInd) == false{
            previosInd = lastInd
        }
        return [self.cards[previosInd], self.cards[currentCardInd],self.cards[nextInd]]
    }
}

struct ContentView_Previews: PreviewProvider {
    static var previews: some View {
        ContentView(cards: OnboardingCard.test)
    }
}