how to keep origin image size in swift ui - swiftui

I am using KFImage to load images from URLs in swift UI, however, I want to keep the width and height that come with the image from the URL they come in different sizes
KFImage(URL(string: egg.logoUrl))
.resizable()
.fixedSize()
I used jetback compose, and I can say that one of the hardest things in swift Ui, is image scaling that requires geometry rendering wherein compose can do it in single function call

Related

SwiftUI Photo Gallery View Smooth Scrolling

I'm building a photo gallery using SwiftUI, and am trying to ensure that a user can smoothly scroll through thousands of photo thumbnails without performance degradation or visible load times for each photo.
So far, my research has led me to use a lazyvgrid within a ScrollView, which seems to perform better than a lazyvstack or a normal grid when working with a large data set. However, when scrolling through the lazyvgrid, it takes a moment for each new row of thumbnails to load (since lazyvgrid is lazy), and this is especially noticeable when scrolling very quickly.
Ultimately, I'm wondering how other apps with photo galleries get around this issue. Is it impossible to avoid when using SwiftUI, and would I need to use something like UIKit's CollectionView with prefetching?
Here's what I'm doing currently:
ScrollView {
LazyVGrid(columns: vGridLayout) {
ForEach(photoLibraryService.items, id: \.self) { asset in
PhotoThumbnailView(assetLocalId: asset.localIdentifier, mediaType: asset.mediaType, duration: asset.duration)
}
}
}
And here's what it looks like when I scroll through it quickly:

Having trouble understanding how HStack content works with fluid widths

I've been running into a pretty consistent problem with how views inside HStack work, with a simplified screenshot to exemplify the issue.
My expectation would be for the width of the green to basically be (expressed like an equation):
Section.width - Image.width
The section width is fluid, and the image width is explicit. Surely that means the green should be correctly calculated?
Any help with what seems to be a basic misunderstanding on my part would be hugely appreciated.
Actually you're right, but there are just default List/Form insets, which can be either changed or removed.
So all you need is
that gives on Xcode 13.4 / iOS 15.5
The height property in your frame for the image is messing with width dimensions. By setting the maxHeight to be infinity, the height property will expand the image to the max possible height, meaning the height of the section, even if it changes the width. You can think of it as, in a way, overriding the ability of the text to stretch its full width.
To fix this, consider changing the maxHeight property by adding a set height, or play around with different types of frames dimensions.
I know this doesn't talk about HStack's specifically, but feel free to check out this video to learn more about layout: https://www.youtube.com/watch?v=zczHBLtpRZo
If you want to launch an app on the app store, you may want to consider learning Geometry Reader to have dynamic dimensions across different screen sizes. This is a tutorial from a really good website, hacking with swift: https://www.youtube.com/watch?v=WNO1b58k7zg&t=505s

Resizing images keeping aspect-ratio?

I am using the last version of Jquery Croppie v2.6.2. Its possible to define Jquery croppie when resizable function is available, to keep the aspect-ratio... the relation between Width/Height? something like this 2:1 .e.g if I resize my image with 500x250 this it's good! but I dont want to change with the square and generate an image 400x250... but also 400x200? or 100x50? Keeping the scale 2:1 when I resize the image using the "square"?
Now I can make this:
Is it possible to keep relation Width/Height when I resize? In other words avoid the "square" can resize the image free without keepping relation between Width/Height... Do you know is it possible by Croppie configuration? Or how Can I update the Jquery Croppie Library to allow this functionality?
set your viewport to a 2:1 ratio ie
viewport: {
width: 200,
height: 100
}
turn off the resizer... that is the little squares on the right and bottom that allow you to change the width and height separately thus changing the aspect ratio. Croppie will still allow you to zoom in on the image.
enableResize: false,

Creating Launch Screen.xib for iOS8 ( ... iOS11, Swift 4 and LaunchScreen.storyboard )

I've just found out that in order to be able to have the description for your app in the app store say "This app is optimized for iPhone 6, and iPhone 6 Plus." you need to use a launch XIB or storyboard file for your launch images (per [Apple][1]).
So, I've created a new Launch Screen xib and now I'm a little but since I usually do everything in code and don't use interface builder. I've deleted the default label that is inserted and dropped a UIImageView into the view. Now I'm wondering how would I:
1) Tell the UIImageView to resize to the size of whatever screen it's on
2) Tell the UIImageView to pick ImageA if a 3.5 inch screen is running the app or the ImageB if a 4 inch screen is running the app etc. etc.
Essentially, I'm just trying to get the launch .xib to mimic the behavior of how the launch screen works normally. Would appreciate it if anyone could provide some assistance on this!
You have two options:
You make use of autolayout and give the imageview a fullscreen appearance (distance to top, bottom, left and right equals 0). This would however result in a clipping of the image for certain screen sizes, what you may not want. So you might want to consider (2)
You place the launch screen image into an asset catalog and just put different images into the different size classes.
I found the answer useful.
The old steps in short for creating the LaunchScreen xib for iOS 8 are below the new steps.
With reference to XCode 9, Swift 3 or Swift 4 and LaunchScreen.storyboard following are the new steps.
First step is to create two images for Portrait and landscape mode splash ( png or jpeg ) in your favorite graphic software. ( If your app only support Portrait mode, you may skip Landscape mode image and settings. )
Portrait mode image :-
Create a 'splash-portrait' image with your own full background for size of "width 1125 x height 2436". Note that the background will clip on various sizes of devices.
Whichever info, graphic, you do not wish to be clipped should be created on center of above image in the size of "width 1125 x height 1471". This should always be in center of above full image.
Landscape mode image :-
Create a 'splash-landscape' image with your own full background for size of "width 2436 x height 1125". Note that the background will clip on various sizes of devices.
Whichever info, graphic, you do not wish to be clipped should be created on center of above image in the size of "width 860 x height 1125". This should always be in center of above full image.
Once both the images are ready, you may add it to xcassets or keep in resource.
Now go for the following steps.
1) "LaunchScreen storyboard" is already created with the new project. Open it.
2) Add an Image View on the view.
3) Set the above saved 'splash-portrait' image to image view source.
4) Set Image view 'Content mode' of Image as "Aspect Fill".
5) Add 4 constraints of Image View for Top, Bottom, Trailing and Leading to Superview.
This is done for the portrait mode app splash.
For landscape mode support, do the following extra steps. ( you may refer full answer by #Sakiboy at
https://stackoverflow.com/a/46089856/2641380 )
6) Click the + button next to the Image view source that you set up in step 3.
7) From the pop-up that is now displayed select Regular for both the Width and Height selectors. This is specifying a new adaptive set for iPads that are in landscape. A new image source field will appear with the title wR hR. Add the 'splash-landscape' image to the wR hR Image source field so the storyboard knows to use a different image when in landscape.
8) Now we need to add support for the 'iphone plus' devices when in landscape. So click the + button next to the Image source field again.
9) This time select compact for the height and regular for the width selectors. This is specifying a new adaptive set for “iPhone plus” devices that are in landscape. A new image source field will appear with the title wR hC.
10) Add the “splash-landscape” image to the wR hC Image source field so the storyboard knows to use a different image when in landscape on an “iPhone plus device”.
As iPad devices are "Regular for both the Width and Height", We will see 'splash-landscape' image in iPad for both portrait and landscape mode. Width 860 for displayable content in 'splash-landscape' image will show full content in both portrait and landscape mode.
The old steps in short for creating the LaunchScreen xib for iOS 8.
1) create a new "LaunchScreen xib" from new file --> user interface --> launch screen ( keep auto layout ON ).
2) Add an image view in the xib --> view (main view).
3) set splash image to it ( the image should not be in assets file ).
4) set image as "Aspect Fit" ( if required ).
5) you may also change the "view" (super view) background color as close to background color of image.
6) select the image view, click from menu - editor - pin - bottom space to super view.
7) this will show red error mark near "view" ( super view of image view ).
8) click on the error mark, you will see approximate two auto layout errors.
9) on clicking on the error you will find menu with auto fix the layout errors.
10) on fixing the errors, you will find total four "Constraints" with "vertical" and "horizontal" space between superview and image.
11) now you may test them in different devices or simulators.
Regards.
You can resize the image by setting constraint to the top, bottom, leading and trailing edges of the superview. Just click the imageview and select Editor->Pin the top context menu. You can also set the aspects of the UIImageView by clicking it and setting it to for instance "Aspect Fit". Make sure the ImageView covers the whole screen before setting the constraints, or else you would have to modify the contstraints.
To set different images for different screen sizes, I would guess you have to create a class and modify to the viewWillAppear method to load an appropriate image
Good luck!
Erik
Create a new file. Under User Interface select View. After, you can name your xib LaunchScreen and you can test it out by adding a label with something like “Test Launch” and run the app. You should see the launch screen appear!
The Launch xib can't have a customized class since your app didn't launch when it is displayed.
What I ended up doing is:
use sizing class feature
Create 3 UI images (one per sizing class)
Use auto layout with constrains which apply to each sizing class
So when you display one type of device the width and hight constrains of the other two UIImageView are set to 0

Cocos2d-iphone load large scrollable image like "plant VS zombie"

How to I load a very large image eg 1024*4608 using cocos2d-iphone and be able to scroll the image?
Your application will be more responsive if you break up your very large image into tiles. Tiles are smaller images, usually 256 X 256, that can be reassembled by your application into the large image. You display just the tiles that are visible. This uses less phone memory.
Here's a blog post with some Cocos2D-iPhone image scrolling.