Spracherkennung für: .m vermutete Sprache: C {C[50] Corba[50] CS[50]} [Methode: maximale Elemente, drei Dimensionen]
// This file is based on third party code, see below for the original author
// and original license.
// Modifications are (c) by Threema AG and licensed under the AGPLv3.
//
// MWGridViewController.m
// MWPhotoBrowser
//
// Created by Michael Waterfall on 08/10/2013.
//
//
#import "MWGridViewController.h"
#import "MWGridCell.h"
#import "MWPhotoBrowserPrivate.h"
#import "MWCommon.h"
#import <ThreemaFramework/ThreemaFramework-Swift.h>
@interface MWGridViewController () {
// Store margins for current setup
CGFloat _margin, _gutter, _marginL, _gutterL, _columns, _columnsL;
}
@end
@implementation MWGridViewController
- (id)init {
if ((self = [super initWithCollectionViewLayout:[UICollectionViewFlowLayout new]])) {
// Defaults
(void)(_columns = 3), _columnsL = 4;
(void)(_margin = 0), _gutter = 1;
(void)(_marginL = 0), _gutterL = 1;
// For pixel perfection...
if (self.traitCollection.horizontalSizeClass == UIUserInterfaceSizeClassRegular) {
// iPad
(void)(_columns = 6), _columnsL = 8;
(void)(_margin = 1), _gutter = 2;
(void)(_marginL = 1), _gutterL = 2;
} else if ([UIScreen mainScreen].bounds.size.height == 480) {
// iPhone 3.5 inch
(void)(_columns = 3), _columnsL = 4;
(void)(_margin = 0), _gutter = 1;
(void)(_marginL = 1), _gutterL = 2;
} else {
// iPhone 4 inch
(void)(_columns = 3), _columnsL = 5;
(void)(_margin = 0), _gutter = 1;
(void)(_marginL = 0), _gutterL = 2;
}
}
return self;
}
#pragma mark - View
- (void)viewDidLoad {
[super viewDidLoad];
[self.collectionView registerClass:[MWGridCell class] forCellWithReuseIdentifier:@"GridCell"];
self.collectionView.alwaysBounceVertical = YES;
///***** BEGIN THREEMA MODIFICATION*********
self.collectionView.backgroundColor = [Colors backgroundView];
///***** END THREEMA MODIFICATION*********
}
- (void)viewWillAppear:(BOOL)animated {
[super viewWillAppear:animated];
UIAccessibilityPostNotification(UIAccessibilityScreenChangedNotification, self.view);
}
- (void)viewWillDisappear:(BOOL)animated {
// Cancel outstanding loading
NSArray *visibleCells = [self.collectionView visibleCells];
if (visibleCells) {
for (MWGridCell *cell in visibleCells) {
[cell.photo cancelAnyLoading];
}
}
[super viewWillDisappear:animated];
}
- (void)viewWillLayoutSubviews {
[super viewWillLayoutSubviews];
[self performLayout];
}
- (void)viewDidLayoutSubviews {
[super viewDidLayoutSubviews];
}
- (void)adjustOffsetsAsRequired {
// Check if current item is visible and if not, make it so!
if (_browser.numberOfPhotos > 0) {
NSIndexPath *currentPhotoIndexPath = [NSIndexPath indexPathForItem:_browser.currentIndex inSection:0];
NSArray *visibleIndexPaths = [self.collectionView indexPathsForVisibleItems];
BOOL currentVisible = NO;
for (NSIndexPath *indexPath in visibleIndexPaths) {
if ([indexPath isEqual:currentPhotoIndexPath]) {
currentVisible = YES;
break;
}
}
if (!currentVisible) {
dispatch_async(dispatch_get_main_queue(), ^{
[self.collectionView scrollToItemAtIndexPath:currentPhotoIndexPath atScrollPosition:UICollectionViewScrollPositionBottom animated:NO];
});
}
}
}
- (void)performLayout {
///***** BEGIN THREEMA MODIFICATION: iOS 11 *********/
CGFloat navBarBottom = 0;
if (_browser.displaySelectionButtons == true) {
self.collectionView.contentInset = UIEdgeInsetsMake(navBarBottom + [self getGutter], 0, _browser.gridToolbar.frame.size.height, 0);
} else {
self.collectionView.contentInset = UIEdgeInsetsMake(navBarBottom + [self getGutter], 0, 0, 0);
}
///***** END THREEMA MODIFICATION: iOS 11 *********/
}
- (void)willAnimateRotationToInterfaceOrientation:(UIInterfaceOrientation)toInterfaceOrientation duration:(NSTimeInterval)duration {
[self.collectionView reloadData];
[self performLayout]; // needed for iOS 5 & 6
}
#pragma mark - Layout
- (CGFloat)getColumns {
if (UIInterfaceOrientationIsPortrait([self currentInterfaceOrientation])) {
return _columns;
} else {
return _columnsL;
}
}
- (CGFloat)getMargin {
if (UIInterfaceOrientationIsPortrait([self currentInterfaceOrientation])) {
return _margin;
} else {
return _marginL;
}
}
- (CGFloat)getGutter {
if (UIInterfaceOrientationIsPortrait([self currentInterfaceOrientation])) {
return _gutter;
} else {
return _gutterL;
}
}
#pragma mark - Collection View
- (NSInteger)collectionView:(UICollectionView *)view numberOfItemsInSection:(NSInteger)section {
return [_browser numberOfPhotos];
}
- (UICollectionViewCell *)collectionView:(UICollectionView *)collectionView cellForItemAtIndexPath:(NSIndexPath *)indexPath {
MWGridCell *cell = [collectionView dequeueReusableCellWithReuseIdentifier:@"GridCell" forIndexPath:indexPath];
if (!cell) {
cell = [[MWGridCell alloc] init];
}
id <MWPhoto> photo = [_browser thumbPhotoAtIndex:indexPath.row];
cell.photo = photo;
cell.gridController = self;
cell.selectionMode = _selectionMode;
cell.isSelected = [_browser photoIsSelectedAtIndex:indexPath.row];
cell.index = indexPath.row;
UIImage *img = [_browser imageForPhoto:photo];
if (img) {
[cell displayImage];
} else {
[photo loadUnderlyingImageAndNotify];
}
return cell;
}
- (void)collectionView:(UICollectionView *)collectionView didSelectItemAtIndexPath:(NSIndexPath *)indexPath {
///***** BEGIN THREEMA MODIFICATION: disable if selection mode is on *********/
if (!_browser.displaySelectionButtons) {
[_browser setCurrentPhotoIndex:indexPath.row];
[_browser hideGrid];
} else {
MWGridCell *cell = (MWGridCell *)[collectionView cellForItemAtIndexPath:indexPath];
[cell selectionButtonPressed];
}
///***** END THREEMA MODIFICATION: disable if selection mode is on *********/
}
- (void)collectionView:(UICollectionView *)collectionView didEndDisplayingCell:(UICollectionViewCell *)cell forItemAtIndexPath:(NSIndexPath *)indexPath {
[((MWGridCell *)cell).photo cancelAnyLoading];
[((MWGridCell *)cell).photo unloadUnderlyingImage];
}
- (CGSize)collectionView:(UICollectionView *)collectionView layout:(UICollectionViewLayout*)collectionViewLayout sizeForItemAtIndexPath:(NSIndexPath *)indexPath {
CGFloat margin = [self getMargin];
CGFloat gutter = [self getGutter];
CGFloat columns = [self getColumns];
CGFloat value = floorf(((self.view.bounds.size.width - (columns - 1) * gutter - 2 * margin) / columns));
return CGSizeMake(value, value);
}
- (CGFloat)collectionView:(UICollectionView *)collectionView layout:(UICollectionViewLayout*)collectionViewLayout minimumInteritemSpacingForSectionAtIndex:(NSInteger)section {
return [self getGutter];
}
- (CGFloat)collectionView:(UICollectionView *)collectionView layout:(UICollectionViewLayout*)collectionViewLayout minimumLineSpacingForSectionAtIndex:(NSInteger)section {
return [self getGutter];
}
- (UIEdgeInsets)collectionView:(UICollectionView *)collectionView layout:(UICollectionViewLayout*)collectionViewLayout insetForSectionAtIndex:(NSInteger)section {
CGFloat margin = [self getMargin];
return UIEdgeInsetsMake(margin, margin, margin, margin);
}
#pragma mark - Helpers
- (UIInterfaceOrientation)currentInterfaceOrientation {
return [[[[self.view window] windowScene] effectiveGeometry] interfaceOrientation] ?: UIInterfaceOrientationUnknown;
}
@end
¤ Dauer der Verarbeitung: 0.1 Sekunden
(vorverarbeitet am 2026-11-04)
¤
*© Formatika GbR, Deutschland