Как создать галерею на iOS
Я начинаю разрабатывать простое приложение для iOS, и это приложение представляет собой простую галерею какой-то фотографии (взятой с веб-сайта).
Первой проблемой, с которой я столкнулся, является создание представления для галереи.
В представлении должно быть что-то вроде этого (или в приложении "Фото" ):
![Sample View]()
однако сделать это так проблематично, во-первых, потому что он использует фиксированное измерение, и я думаю, что это трудно реализовать (для меня).
Другим способом является использование пользовательской ячейки внутри tableview, например:
![custom cell]()
но он по-прежнему использует фиксированный размер.
Какой лучший способ создать галерею, без использования какой-либо третьей части lib (например, Three20)?
Спасибо за любой ответ:)
PS. Я думаю, что использование фиксированного измерения плохо из-за нового iphone 4 (с другим разрешением), я прав?
Ответы
Ответ 1
Вы должны проверить AQGridView, который делает именно то, чего вы пытаетесь достичь. Даже если вы хотите написать свой собственный код, посмотрите на источник AQGridView, как более вероятно, вам понадобится использовать UIScrollView в качестве базы.
Ответ 2
Если вы хотите использовать сторонние классы, следующие обучающие программы могут быть смешаны, они работали для меня.
Здесь хороший вид сетки:
пользовательский подборщик изображений, например, uiimagepicker
И если вы хотите загрузить их асинхронно, используйте это:
изображение ленивая загрузка
Оба учебника очень хорошо описаны и имеют исходный код.
Ответ 3
Разница в разрешении не должна быть проблемой, поскольку iOS, если я правильно помню, масштабирует компоненты и изображения пользовательского интерфейса до правильного разрешения, если обнаруживает, что у него есть сетчатый дисплей. В стороне; не забудьте начать создавать hi/lo-res версии вашей графики, если вы намерены поддерживать оба размера экрана без ухудшения качества.
Пока вы разрабатываете вещи с точки зрения точек вместо пикселей (как это делается в XCode 4), iOS сможет обрабатывать масштабирование для вас прозрачно. На маленьком экране одна точка будет одним пикселем, тогда как на экране сетчатки будет два пикселя. Это позволяет делать вещи с четким представлением на сетчатых дисплеях. Источник
Я знаю, что этот вопрос старый, но я не видел, чтобы кто-то обращался к проблеме с фиксированной шириной, поэтому я думал, что внес свой вклад за один раз.
Ответ 4
Если вы не хотите использовать стороннюю библиотеку, вы должны сделать это в строках UITableView. Из-за того, как UITableView кэширует ячейки, он относительно лёгкий в памяти. Конечно, это больше, чем возможно очень большой UIView внутри UIScrollView. Я сделал это в обоих направлениях, и я был намного счастливее с UITableView.
Итак, в следующий раз мне нужно это сделать? Я планирую использовать AQGridView.
Ответ 5
Um, так как ios6 вышел, правильный способ сделать это с помощью Collection Views:
Apple Docs в CollectionViews
Также см. две сессии WWDC 2012:
Введение в коллекции просмотров
Расширенные виды просмотров
К сожалению, Apple не включала простую галерею или макет покрытия, но ее довольно легко сделать.
Ответ 6
Я написал учебное пособие по созданию медиа-галереи с использованием UICollectionView. Он заполняется из пользовательской фотобиблиотеки. Я думаю, что он будет отлично работать для того, что вы пытаетесь сделать.
Учебное пособие по программированию iPhone: создание галереи изображений, например, над частью 1
Надеюсь, что это поможет. Ура!
Ответ 7
Я сделал что-то очень похожее на это в собственном проекте. Я просто показываю некоторые части кода здесь, но если вы хотите просмотреть полный код, вы можете просмотреть его на GitHub GitHub Repo
Сначала я создал пользовательскую ячейку Collection View с ImageView
в CustomCollectionCell.h
#import <UIKit/UIKit.h>
@interface CustomCollectionCell : UICollectionViewCell
@property (nonatomic , retain) UIImageView *imageView;
@end
в CustomCollectionCell.m
#import "CustomCollectionCell.h"
@implementation CustomCollectionCell
- (id)initWithFrame:(CGRect)frame {
self = [super initWithFrame:frame];
if (self) {
[self setupImageView];
}
return self;
}
#pragma mark - Create Subviews
- (void)setupImageView {
self.imageView = [[UIImageView alloc] initWithFrame:self.bounds];
self.imageView.autoresizingMask = UIViewAutoresizingNone;//UIViewAutoresizingFlexibleWidth | UIViewAutoresizingFlexibleHeight;
[self addSubview:self.imageView];
}
@end
Затем в представлении, где вы хотите, чтобы эскизы были настроены, CollectionView
в ThumbNailViewController.m(фрагмент)
UICollectionView *collectionViewThumbnails;
в ThumbNailViewController.m(фрагмент)
UICollectionViewFlowLayout *layout=[[UICollectionViewFlowLayout alloc] init];
collectionViewThumbnails=[[UICollectionView alloc] initWithFrame:CGRectMake(0, 0, self.view.bounds.size.width, self.view.bounds.size.height - 50) collectionViewLayout:layout];
if (collectionViewThumbnails && layout)
{
[collectionViewThumbnails setDataSource:self];
[collectionViewThumbnails setDelegate:self];
[collectionViewThumbnails registerClass:[CustomCollectionCell class] forCellWithReuseIdentifier:@"cellIdentifier"];
[collectionViewThumbnails setBackgroundColor:[UIColor blackColor]];
[self.view addSubview:collectionViewThumbnails];
}
Затем у вас есть необходимые методы для представлений коллекции. Здесь вы можете настроить то, что вы
//Number of items in the collectionview
- (NSInteger)collectionView:(UICollectionView *)collectionView numberOfItemsInSection:(NSInteger)section
{
return [galleryData count];
}
//Set up what each cell in the collectionview will look like
//Here is where you add the thumbnails and the on define what happens when the cell is clicked
- (UICollectionViewCell *)collectionView:(UICollectionView *)collectionView cellForItemAtIndexPath:(NSIndexPath *)indexPath
{
//initialize custom cell for the collectionview
CustomCollectionCell *cell=[collectionView dequeueReusableCellWithReuseIdentifier:@"cellIdentifier" forIndexPath:indexPath];
[cell.imageView setClipsToBounds:YES];
cell.imageView.contentMode = UIViewContentModeScaleAspectFill;
//format url to load image from
NSString *url = [NSString stringWithFormat:@"http://andrecphoto.weebly.com/uploads/6/5/5/1/6551078/%@",galleryData[indexPath.item]];
//load thumbnail
[cell.imageView setImageWithURL:[NSURL URLWithString:url]
placeholderImage:[UIImage imageNamed:@"placeholder.png"]];
//Sets up taprecognizer for each cell. (onlcick)
UITapGestureRecognizer *tap=[[UITapGestureRecognizer alloc] initWithTarget:self action:@selector(handleTap:)];
[cell addGestureRecognizer:tap];
//sets cell background color to black
cell.backgroundColor=[UIColor blackColor];
return cell;
}
//Sets size of cells in the collectionview
- (CGSize)collectionView:(UICollectionView *)collectionView layout:(UICollectionViewLayout*)collectionViewLayout sizeForItemAtIndexPath:(NSIndexPath *)indexPath
{
return CGSizeMake(100, 100);
}
//Sets what happens when a cell in the collectionview is selected (onlclicklistener)
- (void)handleTap:(UITapGestureRecognizer *)recognizer {
//gets the cell thats was clicked
CustomCollectionCell *cell_test = (CustomCollectionCell *)recognizer.view;
//gets indexpath of the cell
NSIndexPath *indexPath = [collectionViewThumbnails indexPathForCell:cell_test];
if (isConnectedGal)
{
//sets the image that will be displayed in the photo browser
[photoGallery setInitialPageIndex:indexPath.row];
//pushed photobrowser
[self.navigationController pushViewController:photoGallery animated:YES];
}
}
Надеюсь, это ответит на ваш вопрос.
Ответ 8
Вот очень хорошая библиотека под названием FGallery для iOS
-Поддерживает автоматическое вращение
-thumbnail View
-zoom
-delete