Post

Replies

Boosts

Views

Activity

PhotosPicker won't appear when it embedded in popover
When I embedded a PhotosPickerView() in popover, it won't works: struct PhotoPickerTest: View { @State private var selectedPhotoItem: PhotosPickerItem? @State var isTaped: Bool = false var body: some View { Button("", systemImage: "plus") { isTaped = true } .popover(isPresented: $isTaped) { PhotoPickerView() } } func PhotoPickerView() -> some View { PhotosPicker(selection: $selectedPhotoItem) { Image(systemName: "photo") } } } but if I just replace "popover" to "sheet", it works fine: struct PhotoPickerTest: View { @State private var selectedPhotoItem: PhotosPickerItem? @State var isTaped: Bool = false var body: some View { Button("", systemImage: "plus") { isTaped = true } .sheet(isPresented: $isTaped) { PhotoPickerView() } } func PhotoPickerView() -> some View { PhotosPicker(selection: $selectedPhotoItem) { Image(systemName: "photo") } } } I think it's a bug, and bothered me a lot, hope apple engineers can fix it.
3
0
858
Jan ’24
SwiftUI [[stichable]] metal shader & CIFilter written in metal extern"C" can't work at the same time
In my project, I used two metal shaders in two ways. One is link to SwiftUI's modifier .colorEffect(ShaderLibrary.myShader()), which metal shader marked as [[stichable]]. Another one is a custom CIFilter, which kernel been written in external "C" closure. Because custom CIFilter must add build rules so Xcode can compile it, so I added -fcikernel to Metal Compiler and -cikernel to Metal Linker from Build Settings, just like Apple's document told me that. But the result is weird, if I add rules, custom CIFilter works, [[stichable]] shader doesn't work. if I delete rules, and comment out code of CIFilter(for avoiding warning), [[stichable]] shader works, but now I can't use my custom CIFilter. Actually, once these two shaders works well in my project, but when I updated Xcode from 15 to 16, it became weird, the 2 shaders can't exist at same time. Even though I go back to Xcode 15, I can't save them. I have no idea, please help, thank you. XCode 16 / iOS 18 on iPhone 14 Pro
2
0
782
Sep ’24
How to search location in global rather than in local?
I'm doing a weather app, users can search locations for getting weather, but the problem is, the results only shows locations in my country, not in global. For example, I'm in China, I can't search New York, it just shows nothing. Here's my code: @Observable class SearchPlaceManager: NSObject { var searchText: String = "" let searchCompleter = MKLocalSearchCompleter() var searchResults: [MKLocalSearchCompletion] = [] override init() { super.init() searchCompleter.resultTypes = .address searchCompleter.delegate = self } @MainActor func seachLocation() { if !searchText.isEmpty { searchCompleter.queryFragment = searchText } } } extension SearchPlaceManager: MKLocalSearchCompleterDelegate { func completerDidUpdateResults(_ completer: MKLocalSearchCompleter) { withAnimation { self.searchResults = completer.results } } } Also, I've tried to set searchCompleter.region = MKCoordinateRegion( center: CLLocationCoordinate2D(latitude: 0, longitude: 0), span: MKCoordinateSpan(latitudeDelta: 180, longitudeDelta: 360) ), but it doesn't work.
2
0
784
Dec ’24
ScrollView Bug
If put a List in ScrollVIew, List won't appear: import SwiftUI struct BugView: View { let numbers: [Int] = [0, 1, 2] var body: some View { ScrollView { List(numbers, id: \.self) { number in Text(number.description) } } } } #Preview { BugView() }
1
0
453
Apr ’24
Help: scorllTo() doesn't works in VStack
I can read the scrollPosition correctly, but scrollTo() doesn't work. iOS 17, Xcode 15.2. Code like this below(can directly copy and paste): import SwiftUI struct PositionTest: View { @State private var weathers = Weather.samples @State private var scrollPosition: Weather.ID? @State private var isTaped: Bool = false var body: some View { VStack { Text("Scroll Position: " + (scrollPosition ?? "Cupertino")) if !isTaped { CollapsedView( weathers: $weathers, scrollPosition: $scrollPosition, isTaped: $isTaped ) } else { ExpandedView( weathers: $weathers, scrollPosition: $scrollPosition, isTaped: $isTaped ) } } .font(.title) .fontWeight(.semibold) .animation(.default, value: isTaped) } } #Preview { PositionTest() } struct CollapsedView: View { @Binding var weathers: [Weather] @Binding var scrollPosition: Weather.ID? @Binding var isTaped: Bool var body: some View { ScrollViewReader { proxy in ScrollView { VStack(spacing: 20) { ForEach(weathers) { weather in Text(weather.name) .frame(width: 350, height: 227) .foregroundStyle(.white) .background(.blue.gradient) .cornerRadius(40) .id(weather.id as Weather.ID?) .onTapGesture { isTaped.toggle() } } } .frame(maxWidth: .infinity) .scrollTargetLayout() } .scrollIndicators(.hidden) .scrollTargetBehavior(.viewAligned) .scrollPosition(id: $scrollPosition, anchor: .center) .onAppear { proxy.scrollTo(scrollPosition, anchor: .center) } } } } struct ExpandedView: View { @Binding var weathers: [Weather] @Binding var scrollPosition: Weather.ID? @Binding var isTaped: Bool var body: some View { ScrollViewReader { proxy in ScrollView { VStack(spacing: 20) { ForEach(weathers) { weather in Text(weather.name) .frame(width: 250, height: 227) .foregroundStyle(.white) .background(.indigo.gradient) .clipShape(.circle) .id(weather.id as Weather.ID?) .onTapGesture { isTaped.toggle() } } } .frame(maxWidth: .infinity) .scrollTargetLayout() } .scrollIndicators(.hidden) .scrollTargetBehavior(.viewAligned) .scrollPosition(id: $scrollPosition, anchor: .center) .onAppear { proxy.scrollTo(scrollPosition, anchor: .center) } } } } struct Weather: Identifiable { var id: String { name } let name: String let temp: Int static let samples = [ Weather(name: "Cupertino", temp: 12), Weather(name: "New York", temp: 13), Weather(name: "ShangHai", temp: 14), Weather(name: "London", temp: 15), Weather(name: "Las Vegas", temp: 16), ] } I found if I simply change the VStack to LazyVStack in both CollapsedView() and ExpandedView(), the scrollTo() method works fine. But in my project, for some reason I don't want to use LazyVStack, just want to use VStack, is there any way to make scorllTo() works in VStack?
0
0
613
Jan ’24
Swift Data how to get binding from @Query property?
I want to use List(data:, editActions:, rowContent:), the data: needs a $property, but I can't pass $persons in there directly. Is there any way to solve like this below: import SwiftUI import SwiftData struct BindableTest: View { @Environment(\.modelContext) var modelContext @Query var persons: [Person] var body: some View { VStack { Button("Add") { let person = Person(name: "test", age: 12) modelContext.insert(person) } List($persons, editActions: .all) { $person in Text(person.name) Text(person.age.formatted()) } } } } iOS 17
0
3
922
Feb ’24