UIScrollView is an incredibly useful control for iOS development, so it’s not At the very same time, it seems pretty logical to change the. This doesn’t have to be a UIView specifically, but should be . then change the View Controller Scene’s Simulated size to Freeform, and the. In this UIScrollView tutorial you’ll learn how to zoom large images, Now suppose you want to change PhotoScroll to display the image at the.
|Published (Last):||12 July 2015|
|PDF File Size:||7.79 Mb|
|ePub File Size:||20.99 Mb|
|Price:||Free* [*Free Regsitration Required]|
These articles range from recommendations on initializing a descendant view to complex ways to perform asynchronous loading and content preprocessing. However – even keeping in mind the long amount of time this topic has been researched – with each and every new project, new optimization problems arise that are related to UIScrollView and its descendants.
Today, we’re uiscrollvieq to talk about exactly those kinds of problems. We’re also uisdrollview to talk about the solutions that have been created as programmers — both at Distillery and elsewhere — have worked to eliminate and mitigate those problems.
After all, ensuring a smooth user experience UX is crucial to ensuring the success of any web or mobile app. In the majority of modern mobile apps, almost every UITableView cell contains various fo e. By using high-resolution images, however, you create a bottleneck in the scrolling operation. In addition to the problem of the useless loading of a relatively large amount of information via a mobile network, you’re constantly bothered with the problem of UIScrollView rendering.
UIImage goes through several independent uiscrollvidw before the user is able to see the final image on their device’s screen.
iOS: Maintaining Content Offset When The Size Of Your UIScrollView Changes
At the same time, the decompression and rendering processes are delayed lazy in this context – i. At the very same time, it seems pretty logical to change the resolution of the image by using the real size of UIImageViewcaching an image that’s already processed and ready to use.
Such an approach enables an increase in overall scrolling performance; however, it also increases the delay between the moment of image loading initialization and its visual representation on the screen of the device. That’s why this solution is the best choice when the app has to communicate with a third-party service.
If the server-side is developed in-house, however, the next solution Solution 2 is both more efficient and more highly recommended.
In this solution, the size of the content is changed right on the server, allowing receipt of a ready-to-use image on the client-side. There are several ways to implement this solution:. Each of these methods has its own limitations related to the free memory and the time to process.
Thus, you should make your selection in accordance with the computing power of the server equipment. It’s worth noting that one of the most flexible, convenient, and scalable solutions is the use of third-party services, described in Solution 3. In this solution, you use a special service to perform the required operations.
For the project discussed in this article, our team used Cloudinary. Cloudinary is a platform created to manage content for mobile and web applications, offering cloud storage with the admin panel as well as numerous tools for video and image editing.
By using this service, our team managed to implement the following model:. By implementing this solution, our team managed to solve the problem of rendering big images as well as the problem inherent in the useless loading of heavy content.
iOS: Maintaining Content Offset When The Size Of Your UIScrollView Changes
It also enabled flexible integration of the solution in both Android and web platforms. It’s worth noting that such an approach also provides flexibility in the event that additional image sizes uiscrolliew required, as well as in the event that devices’ appearance have significantly increased pixel density.
By using shadows in the field of design, you can create a 3D effect that highlights specific elements. This approach is well-known and very popular. The most popular way of adding shadows to UIView is the following:. In the majority of cases, using the cpnvert method of adding shadows to objects within the cell causes no problems.
However, uiscrollviiew the cell and subviews of UIScrollView become overloaded, such an approach decreases the fluidity of the scrolling experience.
The issue is that the shadow is calculated by using the value of the alpha channel of each pixel of a specific UIViewdecreasing frames per second FPS rendering. To avoid these issues, you need to use shadowPath when adding the shadow. In doing so, you are able to render the shadow by using a specific shape and a gradient, which is significantly faster than the process of pixel-by-pixel calculation.
In such a situation, you must add the following construction to the general configuration:. It’s worth noting that shadowPath must correspond with the size of UIViewwhich means you have to track size changes e. The Core Animation Instrument confirmed a decrease in FPS from the average value of 55 down to 35 on the displays that had problems showing the content.
UIScrollView – UIKit | Apple Developer Documentation
While searching for a solution, the team discovered that the problem is well-known for the devices mentioned, and that a way to eliminate it is to disable the transparency in iOS settings. As a result, the team had to understand the real effect of the transparency and views shadows of the device.
We found out convdrt the existence of shadows of views – which are not displayed on the screen at the moment and are not subviews of UIScrollView – decreased the speed of the rendering of visible elements. The first solution is to disable shadows when UIView is not visible by setting a “0” value for the shadowOpacity parameter.
Though this solution is the easiest and most convenient option when you have a clear system of visibility control, it’s not really versatile.
The second option is to use shadowPath for shadows, which makes rendering much easier. You may face additional requirements, however, in UIView responsiveness, animation, and other operations related to the coordinates’ transformation because you have to support UIBezierPath changes.
Another task we faced and cnovert during this project was the implementation of embedded UIScrollView to create navigation similar to that used in Medium, Twitter, and IMDb. We had to create a header with the general convwrt, a dashboard with changeable tabs fixed on the top of the screen during scrollingas well as an area with a horizontal UIScrollViewwhich contains pages in the form of vertical tables.
An example of the implementation of such a structure is shown below Medium app. However, when we faced the reality presented by our project, we understood that “supported” actually meant “won’t work without magic” in the kinds of cases described above.
The obvious solution was to build a hierarchy shown on the image After conducting an intensive search, we managed to find a solution: Our second attempt was successful, because the solution genuinely works. However, there was still a problem in the form of a significant delay during the opening of the hierarchy controller. When these are equal, cell reuse doesn’t work, so separate cells are created for all usicrollview content being initialized by the data – and those cells stay in the memory of the device.
It turns out that the user is able to interact only with the parent scroll, while all internal views are moved and transformed on the software level, allowing UITableView to properly calculate visible cells. In the project described within cobvert article, the horizontal UIScrollView served as a container for tables, changing their size in accordance with the currently visible UITableView.
After that, the system had to switch the frame and contentOffset tracking to the currently shown UITableView. Though we used this method for the vertical navigation, the key principles can also be applied if all basic elements are located horizontally. They can appear even in the event of slight deviances in the standard flow-usage of the components. We know that — in the words of computer scientist Donald Knuth — “premature optimization is the root of all evil,” but forewarned is forearmed.
And anyway, such knowledge will undoubtedly save you both precious time and nerve cells. See the original article here. Over a million developers have joined DZone. Join the DZone community and get the full member experience. UIImage data initialization Image data decompression Rendering unpacked data in CGContext, scaling, smoothing, and performance of other similar actions At the same time, the coonvert and ho processes are delayed lazy in this context – i.
Resizing Images Server-Side In this solution, the size of the content is changed right on the server, allowing receipt of a uicsrollview image on the client-side. There are several uicsrollview to implement this solution: Creating an asset of the source image that includes several copies uiscroplview the original image with different resolutions.
This action must be performed on the server after the upload is complete. After that, you need to create a convention between all the platforms that includes the content of the asset and information about the basic link along with a postfix in order to display the correct resolution.
For example, let’s imagine you have the following basic link: Here’s the link with a postfix used to get the content in a specific resolution: Striping the image on the server-side “on the fly” during the processing of convedt request. In this case, you have to define parameters that represent the size of the requested content e. Combining the first and the second approaches i.
Using Third-Party Content Management Services Ot this solution, you use a special service to perform the required operations. By using this service, our team managed to implement cconvert following model: There are no assets created when the image is uploaded to the server. The client-side receives a link to the basic image e. The client-side created a link to load the image using Cloudinary. The final resolution is calculated by using the scale coefficient of the display and is uisceollview in pixels not points.
If the system receives similar requests in the future, it is able to use the previously saved image without performing any additional editing. Rendering Shadows for UIView By using shadows in the uiscrlllview of design, you can create a 3D effect that highlights specific elements.
The most popular way of adding shadows to UIView is the following: Using shadowPath To avoid these issues, you need to use shadowPath when adding the shadow. In converr a situation, you must add the following construction to the general configuration: Views That Fail at Hiding: Disabling Shadows The first solution is to disable shadows when UIView is not visible by setting a “0” value for the shadowOpacity parameter.
Using shadowPath The second option is to use shadowPath for shadows, which makes rendering much easier. In other words, if the speed of scrolling is high, the motion is sharply interrupted on the edge of the content without causing movement converr the parent UIScrollView.
The motion is transferred to the parent module only when the scrolling is started in an uiscrllview UIScrollView. If there are more than two levels of embedded content, the transfer of motion to the parent UIScrollView becomes simply impossible when bounce parameters are disabled.
In other words, the scrolling happens only in UIScrollViewwhich was used to detect a gesture. If one sets bounce and alwaysBounceVertical parameters for UIScrollView to true, the behavior described in the first section becomes possible; however, it causes a huge number of negative effects, including sharp movements, jumping, the disappearance of the internal UITableViewand shifting of the content of the horizontal Uiecrollview.
Put the visible content in views, which are containers. Containers must have frame. Calculate the visible part of the table after each tl of the offset of the parent UIScrollView. Should You Follow the Guidelines? Opinions expressed by DZone contributors are their own.