- android - RelativeLayout 背景可绘制重叠内容
- android - 如何链接 cpufeatures lib 以获取 native android 库?
- java - OnItemClickListener 不起作用,但 OnLongItemClickListener 在自定义 ListView 中起作用
- java - Android 文件转字符串
我一直在尝试重新创建 Evernote 在 iOS 7 中使用的弹性 Collection View ,我真的很接近让它正常工作。我设法创建了一个自定义 Collection View 流布局,当内容偏移 y 值位于 Collection View 边界之外时,它修改了布局属性转换。我正在修改 layoutAttributesForElementsInRect 方法中的布局属性,它的行为符合预期,只是当您点击 ScrollView 底部时底部单元格会消失。您将内容偏移量拉得越远,就会有更多的单元格消失。我认为细胞基本上被剪掉了。虽然它不会发生在顶部,但我希望在这两个地方看到相同的行为。这是我的流布局实现现在的样子。
@implementation CNStretchyCollectionViewFlowLayout
{
BOOL _transformsNeedReset;
CGFloat _scrollResistanceDenominator;
}
- (id)init
{
self = [super init];
if (self)
{
// Set up the flow layout parameters
self.minimumInteritemSpacing = 10;
self.minimumLineSpacing = 10;
self.itemSize = CGSizeMake(320, 44);
self.sectionInset = UIEdgeInsetsMake(10, 0, 10, 0);
// Set up ivars
_transformsNeedReset = NO;
_scrollResistanceDenominator = 800.0f;
}
return self;
}
- (void)prepareLayout
{
[super prepareLayout];
}
- (NSArray *)layoutAttributesForElementsInRect:(CGRect)rect
{
// Set up the default attributes using the parent implementation
NSArray *items = [super layoutAttributesForElementsInRect:rect];
// Compute whether we need to adjust the transforms on the cells
CGFloat collectionViewHeight = self.collectionViewContentSize.height;
CGFloat topOffset = 0.0f;
CGFloat bottomOffset = collectionViewHeight - self.collectionView.frame.size.height;
CGFloat yPosition = self.collectionView.contentOffset.y;
// Update the transforms if necessary
if (yPosition < topOffset)
{
// Compute the stretch delta
CGFloat stretchDelta = topOffset - yPosition;
NSLog(@"Stretching Top by: %f", stretchDelta);
// Iterate through all the visible items for the new bounds and update the transform
for (UICollectionViewLayoutAttributes *item in items)
{
CGFloat distanceFromTop = item.center.y;
CGFloat scrollResistance = distanceFromTop / 800.0f;
item.transform = CGAffineTransformMakeTranslation(0, -stretchDelta + (stretchDelta * scrollResistance));
}
// Update the ivar for requiring a reset
_transformsNeedReset = YES;
}
else if (yPosition > bottomOffset)
{
// Compute the stretch delta
CGFloat stretchDelta = yPosition - bottomOffset;
NSLog(@"Stretching bottom by: %f", stretchDelta);
// Iterate through all the visible items for the new bounds and update the transform
for (UICollectionViewLayoutAttributes *item in items)
{
CGFloat distanceFromBottom = collectionViewHeight - item.center.y;
CGFloat scrollResistance = distanceFromBottom / 800.0f;
item.transform = CGAffineTransformMakeTranslation(0, stretchDelta + (-stretchDelta * scrollResistance));
}
// Update the ivar for requiring a reset
_transformsNeedReset = YES;
}
else if (_transformsNeedReset)
{
NSLog(@"Resetting transforms");
_transformsNeedReset = NO;
for (UICollectionViewLayoutAttributes *item in items)
item.transform = CGAffineTransformIdentity;
}
return items;
}
- (BOOL)shouldInvalidateLayoutForBoundsChange:(CGRect)newBounds
{
// Compute whether we need to adjust the transforms on the cells
CGFloat collectionViewHeight = self.collectionViewContentSize.height;
CGFloat topOffset = 0.0f;
CGFloat bottomOffset = collectionViewHeight - self.collectionView.frame.size.height;
CGFloat yPosition = self.collectionView.contentOffset.y;
// Handle cases where the layout needs to be rebuilt
if (yPosition < topOffset)
return YES;
else if (yPosition > bottomOffset)
return YES;
else if (_transformsNeedReset)
return YES;
return NO;
}
@end
我还压缩了项目供人们试用。任何帮助将不胜感激,因为我对创建自定义 Collection View 布局还很陌生。这是它的链接:
https://dl.dropboxusercontent.com/u/2975688/StackOverflow/stretchy_collection_view.zip
谢谢大家!
最佳答案
我能够解决问题。我不确定 iOS 中是否真的存在错误,但问题是单元格实际上是在 Collection View 的内容 View 之外进行翻译的。一旦细胞被翻译得足够远,它就会被剪掉。我发现有趣的是,这不会发生在非视网膜显示器的模拟器中,但会发生在视网膜显示器上,这就是为什么我觉得这实际上可能是一个错误。
考虑到这一点,目前的解决方法是通过覆盖 collectionViewContentSize 方法向 Collection View 的顶部和底部添加填充。执行此操作后,如果在顶部添加填充,则还需要调整单元格的布局属性,以便它们位于正确的位置。最后一步是在 Collection View 本身上设置 contentInset 以调整填充。单独留下滚动指示器插图,因为它们很好。这是我最终的 Collection View Controller 和自定义流布局的实现。
CNStretchyCollectionViewController.m
@implementation CNStretchyCollectionViewController
static NSString *CellIdentifier = @"Cell";
- (void)viewDidLoad
{
// Register the cell
[self.collectionView registerClass:[UICollectionViewCell class] forCellWithReuseIdentifier:CellIdentifier];
// Tweak out the content insets
CNStretchyCollectionViewFlowLayout *layout = (CNStretchyCollectionViewFlowLayout *) self.collectionViewLayout;
self.collectionView.contentInset = layout.bufferedContentInsets;
// Set the delegate for the collection view
self.collectionView.delegate = self;
self.collectionView.clipsToBounds = NO;
// Customize the appearance of the collection view
self.collectionView.backgroundColor = [UIColor whiteColor];
self.collectionView.indicatorStyle = UIScrollViewIndicatorStyleDefault;
}
#pragma mark - UICollectionViewDataSource Methods
- (NSInteger)collectionView:(UICollectionView *)collectionView numberOfItemsInSection:(NSInteger)section
{
return 20;
}
- (UICollectionViewCell *)collectionView:(UICollectionView *)collectionView cellForItemAtIndexPath:(NSIndexPath *)indexPath
{
UICollectionViewCell *cell = [collectionView dequeueReusableCellWithReuseIdentifier:CellIdentifier forIndexPath:indexPath];
if ([indexPath row] % 2 == 0)
cell.backgroundColor = [UIColor orangeColor];
else
cell.backgroundColor = [UIColor blueColor];
return cell;
}
@end
CNStretchyCollectionViewFlowLayout.m
@interface CNStretchyCollectionViewFlowLayout ()
- (CGSize)collectionViewContentSizeWithoutOverflow;
@end
#pragma mark -
@implementation CNStretchyCollectionViewFlowLayout
{
BOOL _transformsNeedReset;
CGFloat _scrollResistanceDenominator;
UIEdgeInsets _contentOverflowPadding;
}
- (id)init
{
self = [super init];
if (self)
{
// Set up the flow layout parameters
self.minimumInteritemSpacing = 10;
self.minimumLineSpacing = 10;
self.itemSize = CGSizeMake(320, 44);
self.sectionInset = UIEdgeInsetsMake(10, 0, 10, 0);
// Set up ivars
_transformsNeedReset = NO;
_scrollResistanceDenominator = 800.0f;
_contentOverflowPadding = UIEdgeInsetsMake(100.0f, 0.0f, 100.0f, 0.0f);
_bufferedContentInsets = _contentOverflowPadding;
_bufferedContentInsets.top *= -1;
_bufferedContentInsets.bottom *= -1;
}
return self;
}
- (void)prepareLayout
{
[super prepareLayout];
}
- (CGSize)collectionViewContentSize
{
CGSize contentSize = [super collectionViewContentSize];
contentSize.height += _contentOverflowPadding.top + _contentOverflowPadding.bottom;
return contentSize;
}
- (NSArray *)layoutAttributesForElementsInRect:(CGRect)rect
{
// Set up the default attributes using the parent implementation (need to adjust the rect to account for buffer spacing)
rect = UIEdgeInsetsInsetRect(rect, _bufferedContentInsets);
NSArray *items = [super layoutAttributesForElementsInRect:rect];
// Shift all the items down due to the content overflow padding
for (UICollectionViewLayoutAttributes *item in items)
{
CGPoint center = item.center;
center.y += _contentOverflowPadding.top;
item.center = center;
}
// Compute whether we need to adjust the transforms on the cells
CGFloat collectionViewHeight = [self collectionViewContentSizeWithoutOverflow].height;
CGFloat topOffset = _contentOverflowPadding.top;
CGFloat bottomOffset = collectionViewHeight - self.collectionView.frame.size.height + _contentOverflowPadding.top;
CGFloat yPosition = self.collectionView.contentOffset.y;
// Update the transforms if necessary
if (yPosition < topOffset)
{
// Compute the stretch delta
CGFloat stretchDelta = topOffset - yPosition;
NSLog(@"Stretching Top by: %f", stretchDelta);
// Iterate through all the visible items for the new bounds and update the transform
for (UICollectionViewLayoutAttributes *item in items)
{
CGFloat distanceFromTop = item.center.y - _contentOverflowPadding.top;
CGFloat scrollResistance = distanceFromTop / _scrollResistanceDenominator;
item.transform = CGAffineTransformMakeTranslation(0, -stretchDelta + (stretchDelta * scrollResistance));
}
// Update the ivar for requiring a reset
_transformsNeedReset = YES;
}
else if (yPosition > bottomOffset)
{
// Compute the stretch delta
CGFloat stretchDelta = yPosition - bottomOffset;
NSLog(@"Stretching bottom by: %f", stretchDelta);
// Iterate through all the visible items for the new bounds and update the transform
for (UICollectionViewLayoutAttributes *item in items)
{
CGFloat distanceFromBottom = collectionViewHeight + _contentOverflowPadding.top - item.center.y;
CGFloat scrollResistance = distanceFromBottom / _scrollResistanceDenominator;
item.transform = CGAffineTransformMakeTranslation(0, stretchDelta + (-stretchDelta * scrollResistance));
}
// Update the ivar for requiring a reset
_transformsNeedReset = YES;
}
else if (_transformsNeedReset)
{
NSLog(@"Resetting transforms");
_transformsNeedReset = NO;
for (UICollectionViewLayoutAttributes *item in items)
item.transform = CGAffineTransformIdentity;
}
return items;
}
- (BOOL)shouldInvalidateLayoutForBoundsChange:(CGRect)newBounds
{
return YES;
}
#pragma mark - Private Methods
- (CGSize)collectionViewContentSizeWithoutOverflow
{
return [super collectionViewContentSize];
}
@end
CNStretchyCollectionViewFlowLayout.h
@interface CNStretchyCollectionViewFlowLayout : UICollectionViewFlowLayout
@property (assign, nonatomic) UIEdgeInsets bufferedContentInsets;
@end
实际上,我将把它放到 Github 上,一旦它启动,我会发布一个指向该项目的链接。再次感谢大家!
关于ios - 在 iOS 7 上创建类似 Evernote 的弹性 UICollectionView,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/19759770/
我对在 Mac 上的 Evernote 应用程序中扩展 Evernote 的功能很感兴趣——这与您在电子表格中添加宏以在每次触发时执行自动功能的方式非常相似。 我知道可以编写其他可以通过 API 与
我正在尝试使用 Evernote API 在新的 Evernote 网络编辑器中生成可编辑笔记的链接。 我已尝试按照 documentation 的建议构建链接还有这个post ,但生成的链接会将我带
在过去的 12 小时里,我们收到了很多传输错误,“HTTP 响应代码:418”。这使得用户数据的同步几乎不可能。 客户端与 API 通信的方式是否有任何变化,还是与周三发布的临时错误有关? 最佳答案
我想在 Emacs/Emacs org 模式下打开 Evernote 笔记链接。 Evernote 笔记链接如下: evernote:///view/52572/s1/8eb24719-30d3-4f
我有一个代码可以使用 evernote sdk 在 evernote 帐户中搜索内容。目前,在用户提供凭据并授权我的应用程序后,我获得了一个帐户的授权 token 。但我不希望用户输入她已经在她的 a
Evernote 的标签不区分大小写,但我无法找到具体说明用于此的排序规则或文化的规范。 标签规范 ( https://dev.evernote.com/doc/reference/Types.htm
我的应用程序会录制音频,然后创建一个 ENNote,并将生成的音频文件作为资源(以当前日期和时间作为标题),然后将此笔记上传到 Evernote。上传完成后,用户已经收到通知。现在我还想显示上传进度。
我下载了EverNote API Xcode项目,但对OCR功能有疑问。借助他们的OCR服务,我可以拍照并在UILabel中显示提取的文本吗? 还是提取出来的文本没有显示给我,而仅用于照片的搜索功能?
我现在正在使用 evernote api 在 iOS 上开发一个应用程序。通过 getNoteContent 函数可以获取笔记的内容,但是如何显示呢?它是 ENML 格式。 我应该从 ENML 中提取
我们最近收到了很多 com.evernote.thrift.transport.TTransportException使用 HTTP 代码 400、429、418。 429 对应于 Too Many
关闭。这个问题不符合Stack Overflow guidelines .它目前不接受答案。 要求我们推荐或查找工具、库或最喜欢的场外资源的问题对于 Stack Overflow 来说是偏离主题的,
我正在尝试注册一个 evernote webhook。但似乎注册表不起作用。 Evernote webhook 注册表格: 我填写了表格,点击“提交”,但总是得到以下错误响应: {"error":"R
如何使用 Evernote Java SDK 列出当前 Evernote 帐户中垃圾箱的内容?我尝试通过调用 NoteStoreClient 的 findNotes() 方法来列出笔记本“垃圾箱”的内
我正在尝试在 ubuntu 上构建 EverNote API。我下载了 Thrift 库并将 API 文件链接到该库。当我尝试编译 API 时,出现以下错误: /usr/lib/gcc/i486-li
内容的类型对于这个问题来说并不是很重要,但假设我想实现一个允许多个用户协作处理共享列表的(本地移动)购物 list 应用程序。 通常如何实现自动工作(无需明确的用户交互)的同步功能?首选方法是每隔几秒
我想通过我们的应用程序(图像或文本或两者)将一些数据存储在“EverNote”中。 我用谷歌搜索,我得到了一些指导,比如 EverNote SDK,我也得到了 EverNoteCounter 示例(当
当您单击操作栏中的中间图标时,会出现一个下拉菜单: 如何制作其中一个? RelativeLayouts? 最佳答案 希望这篇文章对你有用。 http://www.londatiga.net/it/ho
我正在使用 Evernote API 来创建自定义记事本,并且按照流程,我将 cocoapod 安装在曾经的笔记中,并按照文档 Evernote Documentation 中给出的所有步骤进行操作.
我在使用 iOS evernote SDK 在链接的笔记本中创建笔记时遇到了一些问题。 我试图通过以下方式简单地获取有问题的 noteStore EvernoteNoteStore* noteStor
在您的应用程序数据库中保留(或不保留)Evernote 用户的最佳实践或常用方法是什么? 我应该创建自己的成员(member)系统并创建与 Evernote 帐户的连接吗? 我应该将 Evernote
我是一名优秀的程序员,十分优秀!