我有一个UICollectionView和两个子类UICollectionViewFlowLayout。选择单元格时,我调用setCollectionViewLayout:animated:在布局之间切换。过渡完成后,选定的单元格居中,这很好。
可以在不实际选择单元格的情况下完成相同的居中行为吗?我尝试调用setContentOffset:animated:不同的方法但没有成功。或者,我可以contentOffset为要显示的布局指定一个自定义的吗?
更清楚地说,我想在不修改单元格selected属性的情况下拥有这样的东西:
这是我已经拥有的:
[self.collectionView selectItemAtIndexPath:indexPath animated:NO scrollPosition:UICollectionViewScrollPositionNone];
[self.collectionView setCollectionViewLayout:layout animated:YES];
Run Code Online (Sandbox Code Playgroud)
看起来不错:https : //www.dropbox.com/s/9u6cnwwdbe9vss0/17249646-0.mov
但如果我跳过selectItemAtIndexPath:
[self.collectionView setCollectionViewLayout:layout animated:YES];
[self.collectionView scrollRectToVisible:targetFrame animated:YES];
Run Code Online (Sandbox Code Playgroud)
这不是很好(一种挥手动画):https : //www.dropbox.com/s/s3u2eqq16tmex1v/17249646-1.mov
cocoa-touch objective-c ios uicollectionview uicollectionviewlayout
我在 UIViewController 中有一个 UICollectionView 。我还有两种不同的布局,当按下按钮时我会更改为它们。
我在两个 nib 文件中创建的两个单元格之间的布局发生变化。由于这两个单元格做了相同的更改,并且它们的布局只是不同 - 我为它们使用了相同的类,它是 UICollectionViewCell 的子类。
因此,当我的视图加载时,我注册我的两个单元格,如下所示:
[self.tradeFeedCollectionView registerNib:[UINib nibWithNibName:@"BBItemTableViewCell" bundle:nil] forCellWithReuseIdentifier:@"TableItemCell"];
[self.tradeFeedCollectionView registerNib:[UINib nibWithNibName:@"BBItemGridViewCell" bundle:nil] forCellWithReuseIdentifier:@"GridItemCell"];
Run Code Online (Sandbox Code Playgroud)
这两个布局都是 UICollectionViewFlowLayout 的子类。在布局子类中,我只使用一种方法来设置布局/单元格的大小和间距 - 如下所示:
-(id)init
{
self = [super init];
if (self){
self.itemSize = CGSizeMake(320, 80);
self.minimumLineSpacing = 0.1f;
}
return self;
}
Run Code Online (Sandbox Code Playgroud)
这是因为在更改视图时单元格始终具有正确的大小。
要更改视图,我有一个 UIButton,其中包含以下代码:
[self.tradeFeedCollectionView.collectionViewLayout invalidateLayout];
if (!self.gridLayoutActive){
self.gridLayoutActive = YES;
[self.tradeFeedCollectionView setCollectionViewLayout:self.grideLayout animated:YES];
self.lastLayoutUsed = @"GridLayout";
}
else {
self.gridLayoutActive = NO;
[self.tradeFeedCollectionView setCollectionViewLayout:self.tableViewLayout animated:YES];
self.lastLayoutUsed = @"TableLayOut";
}
Run Code Online (Sandbox Code Playgroud)
通过上面的代码,我得到了一个很好的动画,并且两个单元格之间的视图发生变化。
问题
更改视图时,UICollectionView 的可见区域会留下旧单元格,并且尚未更新为新单元格。这些牢房实际上已经改变了形状,但旧牢房的景色却被留下了。当我开始滚动时 …
iphone objective-c ios uicollectionviewcell uicollectionviewlayout
我正在尝试实现" 快速生效 ",但无法使其正常工作,是否存在我做错的事情?
子类化UICollectionViewFlowLayout和覆盖targetContentOffsetForProposedContentOffset函数:
override func targetContentOffsetForProposedContentOffset(proposedContentOffset: CGPoint, withScrollingVelocity velocity: CGPoint) -> CGPoint {
var offsetAdjustment:CGFloat = CGFloat(MAXFLOAT)
let verticalCenter:CGFloat = proposedContentOffset.y + (CGRectGetHeight(self.collectionView!.bounds) / 2.0)
let proposedRect:CGRect = CGRectMake(proposedContentOffset.x,0.0,self.collectionView!.bounds.size.width,self.collectionView!.bounds.size.height)
let array:NSArray = self.layoutAttributesForElementsInRect(proposedRect)!
for layoutAttributes : AnyObject in array {
if let _layoutAttributes = layoutAttributes as? UICollectionViewLayoutAttributes {
if _layoutAttributes.representedElementCategory != UICollectionElementCategory.Cell {
continue
}
let itemVerticalCenter:CGFloat = layoutAttributes.center.y
let _verticalCenter = fabsf(Float(itemVerticalCenter) - Float(verticalCenter))
let _offsetAdjustment = fabsf(Float(offsetAdjustment))
if (_verticalCenter < _offsetAdjustment) {
offsetAdjustment …Run Code Online (Sandbox Code Playgroud) ios uicollectionview uicollectionviewcell uicollectionviewlayout swift
我是新来的UICollectionView。我正在尝试UICollectionViewLayout使用以下代码从网格切换到列表,反之亦然:
@IBAction func switchLayout(sender: AnyObject) {
isGridLayout = !isGridLayout
collectionView?.reloadData()
if isGridLayout {
collectionView?.performBatchUpdates({ () -> Void in
self.collectionView?.collectionViewLayout.invalidateLayout()
self.collectionView?.setCollectionViewLayout(self.gridLayout, animated: true)
}, completion: { (completion) -> Void in
})
} else {
collectionView?.performBatchUpdates({ () -> Void in
self.collectionView?.collectionViewLayout.invalidateLayout()
self.collectionView?.setCollectionViewLayout(self.listLayout, animated: true)
}, completion: { (completion) -> Void in
})
}
}
Run Code Online (Sandbox Code Playgroud)
我一直遇到以下方法崩溃setCollectionViewLayout:animated:,我不明白。任何有关修复此崩溃的帮助都会很棒!
Terminating app due to uncaught exception 'NSInvalidArgumentException', reason: '*** setObjectForKey: object cannot be nil (key: <NSIndexPath: 0xc000000000000016> {length = 2, path …Run Code Online (Sandbox Code Playgroud) objective-c ios uicollectionview uicollectionviewcell uicollectionviewlayout
我从 Apple 的 UICollectionViewFlowLayout 布局代码深处收到崩溃,我不知道如何解决这些问题(下面的堆栈跟踪)。任何建议将不胜感激。
细节:
#0. Crashed: com.apple.main-thread
0 libsystem_platform.dylib 0x1879490d4 __bzero + 36
1 UIKit 0x18e824e40 -[UICollectionViewData _updateItemCounts] + 544
2 UIKit 0x18e824e40 -[UICollectionViewData _updateItemCounts] + 544
3 UIKit 0x18e8e67e0 -[UICollectionViewData numberOfSections] + 28
4 UIKit 0x18f086bc0 -[UICollectionViewFlowLayout _getSizingInfosWithExistingSizingDictionary:] + 612
5 UIKit 0x18f088834 -[UICollectionViewFlowLayout _fetchItemsInfoForRect:] + 152
6 UIKit 0x18e8e66b4 -[UICollectionViewFlowLayout prepareLayout] + 224
7 UIKit 0x18e7cf574 -[UICollectionViewData _prepareToLoadData] + 164
8 UIKit 0x18e7ceb5c -[UICollectionViewData validateLayoutInRect:] + 100
9 UIKit 0x18e7ce55c …Run Code Online (Sandbox Code Playgroud) 我有一个UICollectionViewCell具有UICollectionView带UICollectionViewFlowLayout内。我将单元格作为集合视图的委托和数据源。我正在遵循UICollectionViewDelegateFlowLayout并实现collectionView(_ collectionView: UICollectionView, layout collectionViewLayout: UICollectionViewLayout, sizeForItemAt indexPath: IndexPath) -> CGSize(并返回正确的大小)。
但是,当我打电话时,layout.itemSize.height我得到默认的高度50。
class MyCell: UICollectionViewCell {
fileprivate lazy var collectionView: UICollectionView = {
let collectionView = UICollectionView(frame: .zero, collectionViewLayout: UICollectionViewFlowLayout())
collectionView.delegate = self
collectionView.dataSource = self
collectionView.register(SomeOtherCell.self, forCellWithReuseIdentifier: SomeOtherCell.reuseIdentifier)
collectionView.showsHorizontalScrollIndicator = false
collectionView.showsVerticalScrollIndicator = false
return collectionView
}()
fileprivate lazy var layout: UICollectionViewFlowLayout? = {
let layout = collectionView.collectionViewLayout as? UICollectionViewFlowLayout
layout?.scrollDirection = .horizontal
layout?.sectionInset = UIEdgeInsets.zero
return …Run Code Online (Sandbox Code Playgroud) 我读了 如何垂直居中 UICollectionView 内容 但是当我在这里使用代码时
func collectionView(_ collectionView: UICollectionView, layout collectionViewLayout: UICollectionViewLayout, insetForSectionAt section: Int) -> UIEdgeInsets {
let navBarHeight = self.navigationController?.navigationBar.frame.height
let collectionViewHeight = (self.collectionView?.frame.height)! - navBarHeight!
let itemsHeight = self.collectionView?.contentSize.height
let topInset = ( collectionViewHeight - itemsHeight! ) / 4
return UIEdgeInsetsMake(topInset ,0, 0 , 0)
}
Run Code Online (Sandbox Code Playgroud)
但是当滚动集合视图时,这将显示不正确的形式,所以这是我的代码,因为我的集合视图单元格是方形的并且等于屏幕宽度
override func viewDidLayoutSubviews() {
super.viewDidLayoutSubviews()
showImagesCV.contentInset = UIEdgeInsets(top: spacing, left: spacing, bottom: spacing, right: spacing)
if let flowLayout = showImagesCV.collectionViewLayout as? UICollectionViewFlowLayout{
cellWidth = UIScreen.main.bounds.width
cellHeight = cellWidth //yourCellHeight = …Run Code Online (Sandbox Code Playgroud) ios uicollectionview uicollectionviewcell uicollectionviewlayout swift4
uikit ios uicollectionview uicollectionviewcell uicollectionviewlayout
我正在尝试实现项目的多行序列(如下所示的 Final Cut Pro 或 Adobe Premiere pro 中的视频编辑序列)。
虽然我总是可以使用 UIScrollView 并手动放置自定义视图来实现它,但它会很乏味,尤其是在重新排序项目和动画更改以及使用捏合手势缩放时间线时。是否可以使用 UICollectionViewCompositionalLayout 和 UICollectionViewDiffableDataSource 使用 UICollectionView 来实现它?从 WWDC 视频来看,使用组合布局似乎几乎所有事情都是可能的,但尚不清楚是否可以使用它来实现时间线。也许 UICollectionView 不是这个用例的正确范例,应该使用 UIScrollView?即使我使用 UIScrollView,管理诸如拖动和重新排序项目、动画数据源更改、修剪项目、缩放内容也将成为问题。任何指向实现这些功能的现有代码库的指针?
ios uicollectionview uicollectionviewlayout swift uicollectionviewcompositionallayout
ios ×10
swift ×4
objective-c ×3
cocoa-touch ×1
iphone ×1
swift4 ×1
uicollectionviewcompositionallayout ×1
uikit ×1