我有一个水平滚动的 UICollectionView,其中 UICollectionViewCells 与 Collection View 本身一样高,宽度是三分之一(所以一次适合三个)。 Collection View 被分页并使用默认的流布局。
单元格来自 .xib 文件并使用自动布局将内容保持在原位。
我想做的是让 Collection View 的高度在两个预定义的高度之间切换,并让单元格的高度始终填充可用空间,即使在动画期间也是如此。
Collection View 动画是通过像这样将顶部约束动画化到它的父 View 来完成的,并且似乎可以工作:
UIView.animateWithDuration(0.5, animations: { () -> Void in
self.collectionViewTopConstraint.constant = (self.collectionViewTopConstraint.constant == 50 ? 100 : 50)
self.view.layoutIfNeeded()
})
然而,这不会影响单元格。
我尝试在动画 block 的末尾添加以下内容:
self.collectionView.performBatchUpdates({ () -> Void in
}, completion: nil)
这几乎可行,但单元格从一个高度交叉淡化到另一个高度,而不是仅仅改变高度,这看起来很糟糕。
我也试过以下方法:
self.collectionView.collectionViewLayout.invalidateLayout()
这实现了同样的效果,但没有那么流畅。
此外,在这两种情况下,如果重复调用切换动画,我会收到此警告:
the behavior of the UICollectionViewFlowLayout is not defined because:
the item height must be less than the height of the UICollectionView minus the section insets top and bottom values.
我做了很多研究,但我发现的所有内容都涉及自定义布局或在我认为不适用于我的不同布局之间切换,因为即使 Collection View 的高度在变化,布局也使用相同的逻辑来定位元素。
有什么想法吗?
谢谢!
最佳答案
我认为这可以通过在动画之前更改单元格的 itemSize 来实现。单元格的原始大小设置为与下图相同的值,但没有 +sign*50 项。
- (IBAction)toggleCollectionViewSize:(id)sender {
self.collectionViewTopConstraint.constant = (self.collectionViewTopConstraint.constant == 50)? 100 : 50;
NSInteger sign = (self.collectionViewTopConstraint.constant == 50)? 1 : -1;
self.layout.itemSize = CGSizeMake(self.collectionView.frame.size.width/3.0 , self.collectionView.frame.size.height + sign*50);
[UIView animateWithDuration:.5 animations:^{
[self.view layoutIfNeeded];
}];
}
我在顶部、中间和底部都有 View 的单元格上对此进行了测试。看起来不错,但底部 View 有轻微的移动,我无法解释。当转换发生时,您仍然会看到单元格的轻微褪色(其 alpha 值降低)。如果 Collection View 背景颜色与单元格背景颜色相同,则可以最小化这种视觉效果。
编辑后:
如果使用计时器而不是 animateWithDuration,效果会更好;我不会那样褪色。
-(void)viewWillLayoutSubviews {
self.layout.itemSize = CGSizeMake(self.collectionView.bounds.size.width/3.0 , self.collectionView.bounds.size.height - 1); // the -1 suppresses a warning about the height that you get on every toggle. I still get one warning at the start.
}
- (IBAction)toggleCollectionViewSize:(id)sender {
NSInteger sign = (self.topCon.constant == 50)? 1 : -1;
[NSTimer scheduledTimerWithTimeInterval:.01 target:self selector:@selector(shrink:) userInfo:@(sign) repeats:YES];
}
-(void)shrink:(NSTimer *) aTimer {
NSInteger sign = [aTimer.userInfo integerValue];
self.topCon.constant += sign;
if (self.topCon.constant == 100 || self.topCon.constant == 50) {
[aTimer invalidate];
}
}
关于ios - 调整 UICollectionViewCells 的大小以始终填充 UICollectionView,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/26142172/
我的目标是转换表单输入,例如“100兆字节”或“1GB”,并将其转换为我可以存储在数据库中的文件大小(以千字节为单位)。目前,我有这个:defquota_convert@regex=/([0-9]+)(.*)s/@sizes=%w{kilobytemegabytegigabyte}m=self.quota.match(@regex)if@sizes.include?m[2]eval("self.quota=#{m[1]}.#{m[2]}")endend这有效,但前提是输入是倍数(“gigabytes”,而不是“gigabyte”)并且由于使用了eval看起来疯狂不安全。所以,功能正常,
我正在使用的第三方API的文档状态:"[O]urAPIonlyacceptspaddedBase64encodedstrings."什么是“填充的Base64编码字符串”以及如何在Ruby中生成它们。下面的代码是我第一次尝试创建转换为Base64的JSON格式数据。xa=Base64.encode64(a.to_json) 最佳答案 他们说的padding其实就是Base64本身的一部分。它是末尾的“=”和“==”。Base64将3个字节的数据包编码为4个编码字符。所以如果你的输入数据有长度n和n%3=1=>"=="末尾用于填充n%
这里有一个很好的答案解释了如何在Ruby中下载文件而不将其加载到内存中:https://stackoverflow.com/a/29743394/4852737require'open-uri'download=open('http://example.com/image.png')IO.copy_stream(download,'~/image.png')我如何验证下载文件的IO.copy_stream调用是否真的成功——这意味着下载的文件与我打算下载的文件完全相同,而不是下载一半的损坏文件?documentation说IO.copy_stream返回它复制的字节数,但是当我还没有下
我有一个驼峰式字符串,例如:JustAString。我想按照以下规则形成长度为4的字符串:抓取所有大写字母;如果超过4个大写字母,只保留前4个;如果少于4个大写字母,则将最后大写字母后的字母大写并添加字母,直到长度变为4。以下是可能发生的3种情况:ThisIsMyString将产生TIMS(大写字母);ThisIsOneVeryLongString将产生TIOV(前4个大写字母);MyString将生成MSTR(大写字母+tr大写)。我设法用这个片段解决了前两种情况:str.scan(/[A-Z]/).first(4).join但是,我不太确定如何最好地修改上面的代码片段以处理最后一种
我正在尝试解析一个文本文件,该文件每行包含可变数量的单词和数字,如下所示:foo4.500bar3.001.33foobar如何读取由空格而不是换行符分隔的文件?有什么方法可以设置File("file.txt").foreach方法以使用空格而不是换行符作为分隔符? 最佳答案 接受的答案将slurp文件,这可能是大文本文件的问题。更好的解决方案是IO.foreach.它是惯用的,将按字符流式传输文件:File.foreach(filename,""){|string|putsstring}包含“thisisanexample”结果的
1.错误信息:Errorresponsefromdaemon:Gethttps://registry-1.docker.io/v2/:net/http:requestcanceledwhilewaitingforconnection(Client.Timeoutexceededwhileawaitingheaders)或者:Errorresponsefromdaemon:Gethttps://registry-1.docker.io/v2/:net/http:TLShandshaketimeout2.报错原因:docker使用的镜像网址默认为国外,下载容易超时,需要修改成国内镜像地址(首先阿里
Region是HBase数据管理的基本单位,region有一点像关系型数据的分区。region中存储这用户的真实数据,而为了管理这些数据,HBase使用了RegionSever来管理region。Region的结构hbaseregion的大小设置默认情况下,每个Table起初只有一个Region,随着数据的不断写入,Region会自动进行拆分。刚拆分时,两个子Region都位于当前的RegionServer,但处于负载均衡的考虑,HMaster有可能会将某个Region转移给其他的RegionServer。RegionSplit时机:当1个region中的某个Store下所有StoreFile
我在一段非常简单的代码(如我所想)中得到了一个错误的值:org=4caseorgwhenorg=4val='H'endputsval=>nil请不要生气,我希望我错过了一些非常明显的东西,但我真的想不通。谢谢。 最佳答案 这是典型的Ruby错误。case有两种被调用的方法,一种是你传递一个东西作为分支的基础,另一种是你不传递的东西。如果您确实在case中指定了一个表达式语句然后评估所有其他条件并与===进行比较.在这种情况下org评估为false和org===false显然不是真的。所有其他情况也是如此,它们要么是真的,要么是假的。
我有以下内容:text.gsub(/(lower)(upper)/,'\1\2')我可以将\2替换为大写吗?类似于:sed-e's/\(abc\)/\U\1/'这在Ruby中可行吗? 最佳答案 查看gsub文档:str.gsub(模式){|匹配|block}→new_str在block形式中,当前匹配字符串作为参数传入,$1、$2、$`、$&、$'等变量将被适当设置。block返回的值将替换为每次调用的匹配项。"alowerupperb".gsub(/(lower)(upper)/){|s|$1+""+$2.upcase}
print"Enteryourpassword:"pass=STDIN.noecho(&:gets)puts"Yourpasswordis#{pass}!"输出:Enteryourpassword:input.rb:2:in`':undefinedmethod`noecho'for#>(NoMethodError) 最佳答案 一开始require'io/console'后来的Ruby1.9.3 关于ruby-为什么不能使用类IO的实例方法noecho?,我们在StackOverflow上