实现“iOS 照片风格”的最佳方式平铺图片库

发布于 2024-12-16 01:39:45 字数 460 浏览 2 评论 0原文

我有一个应用程序,基本上可以用来下载、上传和管理来自各种网络服务的照片。

我希望图像列表视图看起来像 iOS 照片应用程序,但不太确定最好的方法是什么。

我想我可以使用 NSMutableArray 和子类 UIScrollView 从头开始​​创建该功能,但我真的很想使用 NSFetchedResultsController 因为与图像相关的一些数据是在核心数据中动态/异步更新/插入/删除的。

现在我已经设置了一些非常hacky的东西。
我创建了一个单独的 Core Data 实体来保存与每个托管对象中 4 张照片的关系,并让 UITableView 循环遍历它们。然后 cellforrow delegate 将循环遍历每个表格单元格中的 4 张照片。这种方法很糟糕,因为很难动态删除和插入照片,而且每次更新时我都必须重建关系并重新加载表。

我查看了其他一些执行此操作的库,但我真的想了解执行此操作的最简单有效的方法是什么。

I have an app that basically can be used to download, upload, and manage photos from various web services.

I want the image list view to look like the iOS Photos app but not quite sure what the best way to do that is.

I was thinking I could use NSMutableArray and subclass UIScrollView to create that functionality from scratch but I'd really like to use NSFetchedResultsController because some of the data related to the images are dynamically/asynchronously updated/inserted/deleted in Core Data.

Right now I've setup something pretty hacky.
I created an separate Core Data entity to hold relationships to 4 photos in each managed object and I made UITableView loop through them. Then cellforrow delegate would loop through the 4 photos in each table cell. This approach sucks because it's hard to delete and insert photos dynamically and I have to reconstruct relationships and reload the table each time an update is made.

I've looked at some other libraries that do this but I really want to understand what the most simple and efficient way to do this is.

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(4

方圜几里 2024-12-23 01:39:45

如果您引用的是平铺视图,则可以使用 UITableViewUIScrollView 复制该视图。如果您希望它侧向滚动,那么 UIScrollView 就是起点。

如果您希望它垂直滚动(我建议在 iPhone 上这样做),请使用带有自定义 UITableViewCellUITableView

至于核心数据方面,您可能会遇到错误,您正在尝试在核心数据中存储 UI 状态信息(单元格中有多少张照片)。 Core Data 不应该关心单元格中有多少图像。

UITableViewCell

要使用 UITableView,您需要创建一个包含所有图像的数组。然后,您可以通过将该数组除以每行的图像数量来确定需要的行数。

从那里您应该子类化 UITableViewCell 并传入该单元格要绘制的 4 个图像。然后,将 4 个 UIImageView 实例添加到自定义单元格并设置图像就很简单了。

UIScrollView

对于滚动视图,您为每个图像创建一个 UIImageView ,然后将它们添加为 UIScrollView 的子视图。然后,您将设置每个 UIImageView 的框架,以便它们显示在网格中。

如果您发现图像数量超出了内存的容量,那么您将需要处理平铺问题,有效地关注用户在用户边缘之前滚动和填充的位置(通过移动屏幕外图像视图)正在滚动到。这与您通过 UITableView 的单元格排队免费有效获得的效果相同。

If you are referring to the tile view, you can duplicate that using a UITableView or a UIScrollView. If you want it to side scroll then a UIScrollView is the starting point.

If you want it to scroll vertically (which I recommend on iPhone) then use a UITableView with a custom UITableViewCell.

As for the Core Data side, you are probably coming at this incorrect, you are trying to store UI state information (how many photos are in a cell) in core data. Core Data should not care about how many images are in a cell.

UITableViewCell

To use a UITableView you would create an array that contains all of your images. You can then determine how many rows you need by dividing that array by the number of images per row.

From there you should subclass UITableViewCell and pass in the 4 images for that cell to draw. Then it is a simple matter of adding 4 UIImageView instances to the custom cell and setting the images.

UIScrollView

For a scrollview you crate a UIImageView for each image and then add them as subviews of the UIScrollView. You would then set the frame of each UIImageView so that they are displayed in a grid.

If you find you have more images than you can hold in memory at once then you will need to deal with tiling, effectively paying attention to where the user is scrolling and filling in (via moving the offscreen image views) ahead of the edge the user is scrolling towards. This is the same thing you get effectively for free with a UITableView via its queuing of cells.

﹏半生如梦愿梦如真 2024-12-23 01:39:45

我刚刚用 UITableView 做了这个 - 你对关系的思考太多了。

对于我的解决方案,我创建了一个 UITableViewCell 子类,它有四个按钮作为属性。

在我的 cellForRow 方法中,我找出哪四个图像属于该行,然后为适当的按钮设置适当的图像。

我的图像位于视图控制器的数组中。我在 viewDidLoad 中填充数组。每当我从 ManagedObjectContext 添加或删除图像时,我都会重新填充数组,然后重新加载表格视图。重新加载表格视图将适当地重新排列单元格中的图像。

滚动很顺利,我遇到的唯一缺点是,当我删除图像时,我希望图像能够动画到新位置,但我认为我无法通过此设置实现这一点。

I just did this with a UITableView - you are over thinking it with the relationships.

For my solution I created a UITableViewCell subclass has four buttons as properties.

In my cellForRow method I figure out which four images belong to that row and then set the appropriate image for the appropriate button.

My images are in an array in my view controller. I populate the array in viewDidLoad. Whenever I add or delete an image from the managedObjectContext I repopulate the array and then reload the tableview. Reloading the tableview will rearrange the images in the cell appropriately.

Scrolling is smooth and the only drawback I have run into is that I would like the images to animate to their new positions when I delete one, but I do not think that I'll be able to pull that off with this setup.

逐鹿 2024-12-23 01:39:45

我认为一个非常好的实现是AQGridView

它很容易扩展,具有很好的重新排序功能(请参阅跳板演示)并且可以重用单元。

如果您曾经实现过 TableViewDelegate,那么您应该能够使用它。

I think a very nice implementation is AQGridView.

It is easy to extends, has nice reordering (see the springboard demo) and it reuses the cell.

If you ever implemented a TableViewDelegate, you should be able to use it.

↙厌世 2024-12-23 01:39:45

您应该查看 Three20 照片查看器。该项目位于 github 上。另外,这里有一个很好的照片查看器教程

You should check out the Three20 photo viewer. The project is on github. Also, there's a nice tutorial for the photo viewer here

~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文