现在已经有几天了。我正在尝试允许应用的客户在购物时在两种显示类型之间切换。
现在我正在使用2个UICollectionView
和他们自己的自定义UICollectionViewCell
,并且两者之间的切换工作正常,但我发现使用2个不同的UICollectionView
' s正在变得痛苦。我为我的主要UICollectionView
实施的某些内容在替代UICollectionView
中无效。
这是显示更改的方式。我使用自定义方法UISegmentedControl
:
- (void)displayTypeSegmentSelected
{
_selectedDisplayTypeIndex = [_displayTypeControl selectedSegmentIndex];
if (_selectedDisplayTypeIndex == 0) {
NSLog(@"Single file item view selected");
_fromCollectionView = _collectionView;
_toCollectionView = _collectionView2;
} else if (_selectedDisplayTypeIndex == 1) {
NSLog(@"Grid style view selected");
_fromCollectionView = _collectionView2;
_toCollectionView = _collectionView;
}
[_fromCollectionView removeFromSuperview];
[_toCollectionView setFrame:[_superView bounds]];
[_superView addSubview:_toCollectionView];
}
我通过stackoverflow提出了两个不同的建议,说明了我正在尝试做的更好的方法。
UICollectionViewFlowLayout
并在它们之间切换而不是2 UICollectionView
。UICollectionViewCell
。我觉得第一种方式会更好。我需要使接口构建器UICollectionViewFlowLayout
成为IBOutlet,因为未以编程方式创建连接的UICollectionView
。然后我以编程方式创建第二个UICollectionViewFlowLayout
。
在我的displayTypeSegmentSelected方法中,我根据所选的段加载两个UICollectionViewFlowLayout
中的一个。
单个文件显示如下所示:
网格样式显示如下所示:
问题:
我认为我有正确的想法去做我原来的问题以及如何做的最佳方式。但是,我会从一个更有经验的开发人员那里得到一个意见和例子。 你会怎么做到这一点,你能告诉我一个明确的例子,我可以去搞乱吗?
亲切的问候
答案 0 :(得分:2)
这就是我最终做的事情。
点击特定的分段控件后,我更改了布局并重新加载了单元格。
- (void)displayTypeSegmentSelected
{
_selectedDisplayTypeIndex = [_displayTypeControl selectedSegmentIndex];
if (_selectedDisplayTypeIndex == 0) {
NSLog(@"Single file item view selected");
[_collectionView setCollectionViewLayout:_flowLayout2 animated:YES];
[_collectionView reloadItemsAtIndexPaths:[_collectionView indexPathsForVisibleItems]];
} else if (_selectedDisplayTypeIndex == 1) {
NSLog(@"Grid style view selected");
[_collectionView setCollectionViewLayout:_flowLayout animated:YES];
[_collectionView reloadItemsAtIndexPaths:[_collectionView indexPathsForVisibleItems]];
}
}
在我的cellForItemAtIndexPath
中,根据屏幕上显示的布局,我加载了具有正确设置的特定自定义单元格。
-(UICollectionViewCell *)collectionView:(UICollectionView *)collectionView cellForItemAtIndexPath:(NSIndexPath *)indexPath object:(PFObject *)object
{
NSLog(@"collectionview 1 loaded");
static NSString *CellIdentifier = @"Cell";
VAGGarmentCell *cell = [_collectionView dequeueReusableCellWithReuseIdentifier: CellIdentifier forIndexPath:indexPath];
static NSString *CellIdentifier2 = @"Cell2";
VAGGarmentCell2 *cell2 = [_collectionView dequeueReusableCellWithReuseIdentifier:CellIdentifier2 forIndexPath:indexPath];
if ([[_collectionView collectionViewLayout] isEqual: _flowLayout]) {
[[cell activityIndicator] startAnimating];
PFFile *userImageFile = [object valueForKey:@"image"];
[[cell imageView] setFile: userImageFile];
[[cell imageView] loadInBackground];
[[cell activityIndicator] stopAnimating];
[[cell title] setText:[object valueForKey:@"title"]];
[[cell price] setText:[NSString stringWithFormat: @"£%@ GBP", [object valueForKey:@"price"]]];
return cell;
} else if ([[_collectionView collectionViewLayout] isEqual: _flowLayout2]) {
[[cell2 activityIndicator] startAnimating];
PFFile *userImageFile = [object valueForKey:@"image"];
[[cell2 imageView] setFile: userImageFile];
[[cell2 imageView] loadInBackground];
[[cell2 activityIndicator] stopAnimating];
[[cell2 title] setText:[object valueForKey:@"title"]];
[[cell2 price] setText:[NSString stringWithFormat: @"£%@ GBP", [object valueForKey:@"price"]]];
return cell2;
}
return 0;
//_addToFavouritesButton = [cell addFavouriteButton];
[_addToFavouritesButton addTarget:_thisController action:@selector(addToFavouritesButtonTapped:) forControlEvents:UIControlEventTouchUpInside];
}
在我的viewDidLoad中,我引用单个项目显示的自定义单元格的nib文件。
// Grab cell nib file and give a reuse identifier
[_collectionView registerNib:[UINib nibWithNibName:@"VAGGarmentCell2" bundle:nil] forCellWithReuseIdentifier:@"Cell2"];
我遇到了崩溃,但他们很难复制,尽管每次我在不同的布局之间切换时,我的记忆力会上升和上升。我猜测我需要删除一些旧代码。我明天就把它弄清楚,然后用仪器检查一下。然而,这已经完成,我可以继续前进。
我可能需要重构我重复的代码。
答案 1 :(得分:2)
我在collectionView显示的切换动画中遇到了一些问题。你的解决方案对我有帮助。
这是我的结果。
这是解决方案
在ViewController中切换操作
if self.displayType == .grid {
self.displayType = .table
}else {
self.displayType = .grid
}
// Only update item size here
self.updateFlowLayout()
self.collectionView.performBatchUpdates({
self.collectionView.setCollectionViewLayout(self.flowLayout, animated: true)
}, completion: { (finished) in
})
我正在使用一个collectionViewCell。 覆盖单元格的layoutSubviews
override func layoutSubviews() {
super.layoutSubviews()
if (self.bounds.width / self.bounds.height) > 1.4 {
if self.displayType != .table {
self.displayType = .table
}
}else {
if self.displayType != .grid {
self.displayType = .grid
}
}
}
并在displayType
中var displayType : CastDisplayType = .grid {
didSet {
//Update constraints of subviews between cell
updateLayout()
}
}
希望它对某些人有所帮助。