SUPER EDYCJA:Płynne przewijanie z ponad 500 obrazami
W porządku, po kilku różnych zmianach mam jaśniejsze pytanie. Zasadniczo zmagam się z używaniem NSCache. Mam widok kolekcji, jak widać poniżej i chcę być w stanie zminimalizować opóźnienie przewijania z obrazami, które robię w większości przypadków. Trudną częścią jest przejście na pełnowymiarowy obraz. Jest w innym widoku i chciałbym przejść do pełnowymiarowego zdjęcia, podobnie jak Apple do aplikacji ze zdjęciami.
Wygląda na to, że Apple buforuje obrazy i uzyskuje do nich dostęp w różny sposób. Odkryłem, że muszę załadować oryginalną miniaturę, a następnie po pobraniu pełnego rozmiaru obrazu mogę ją zastąpić. Ale nie jestem pewien, jak to zrobić.
tej pory co mam to:
UICollectionview
- (void)viewDidLoad
{
[super viewDidLoad];
// Do any additional setup after loading the view.
self.myCache = [[NSCache alloc] init];
}
//Reusable cell structure
- (UICollectionViewCell *)collectionView:(UICollectionView *)cv cellForItemAtIndexPath:(NSIndexPath *)indexPath {
//cell
CoverPhotoCell *cell = [cv dequeueReusableCellWithReuseIdentifier:@"CoverImgCell" forIndexPath:indexPath];
cell.backgroundColor = [UIColor blackColor];
cell.clipsToBounds = YES;
cell.opaque = YES;
cell.layer.shouldRasterize = YES;
cell.layer.rasterizationScale = [UIScreen mainScreen].scale;
Media *object = [[Media alloc] init];
object = [self.photoListArray objectAtIndex:indexPath.item];
//Remove old cell
for (UIView *subview in [cell subviews]){
if (subview.tag != 0)
{
[subview removeFromSuperview];
}
}
//UIImage
UIImage *thumbImg = [_myCache objectForKey:object.url];
if (thumbImg) {
cell.imageView.image = thumbImg;
}
else {
cell.imageView.image = nil;
UIImage *thumbImg = [[UIImage alloc] initWithCGImage:[object.asset aspectRatioThumbnail]];
dispatch_async(dispatch_get_main_queue(), ^{
cell.imageView.image = thumbImg;
});
[_myCache setObject:thumbImg forKey:object.url];
}
//thumbnail
cell.imageView.tag = indexPath.row + 1;
cell.imageView.layer.borderWidth = 5;
cell.imageView.layer.borderColor = [UIColor whiteColor].CGColor;
cell.imageView.contentMode = UIViewContentModeScaleAspectFit;
cell.imageView.frame = CGRectMake(0, 0, 125, 125);
return cell;
}
//User taps image
- (void)prepareForSegue:(UIStoryboardSegue *)segue sender:(id)sender
{
if ([segue.identifier isEqualToString:@"PhotoSegue"]) {
DetailPageController *controller = segue.destinationViewController;
NSIndexPath *selectedIndex = [self.collectionView indexPathsForSelectedItems][0];
controller.initialIndex = (NSUInteger)selectedIndex.item;
controller.photos = self.photoListArray;
}
}
Więc to jest mój kod NSCache, następnie używam segue do pełnego kontrolera widoku, który wyświetla obraz w pełnej rozdzielczości zdjęcia. Jak załadować najpierw miniaturę, a następnie obraz w pełnym rozmiarze.
Także jakaś myśl o tym, jak jabłko ładuje swoje obrazy tak szybko? Czy używają innego sposobu buforowania? Czy robię coś niepoprawnie.
rafinowany Edit:
Czy ktoś poczta lub przynajmniej pkt mnie kierunku niektóre przykładowy kod gdzie mogę pokazać miniatury, gdy użytkownik przewija szybko i załadować rzeczywiste obrazy, kiedy zwolnić, podobnie jak myślę, aplikacja przyczep filmowych jabłek.
* „Trudna część przenosi się do obrazu Duży format Jest to w innym świetle i chciałbym przejścia na zdjęcie Duży format, jak również firmy Apple robi z ich aplikacji Zdjęcia.” * - prawda mieć na myśli konkretny wymiar? * Wygląda na to, że Apple buforuje obrazy i uzyskuje do nich dostęp inaczej Stwierdziłem, że muszę załadować oryginalną miniaturę wtedy, gdy pobierany jest pełnowymiarowy obraz Mogę go zastąpić Ale nie jestem pewien jak zrób to. "* Czy możesz to wyjaśnić? W jaki sposób uzyskują dostęp do niego "inaczej"? Czego nie jesteś pewien? –