gpt4 book ai didi

ios - 动态调整 UICollectionView 的补充 View (包含多行 UILabel 的)

转载 作者:可可西里 更新时间:2023-11-01 03:32:15 24 4
gpt4 key购买 nike

在 UICollectionView 的补充 View (标题)内,我有一个多行标签,我想将其截断为 3 行。

enter image description here

当用户点击标题(补充) View 上的任意位置时,我想将 UILabel 切换为 0 行以便显示所有文本,并相应地增加 collectionView 补充 View 的高度(最好是动画)。点击标题后会发生以下情况:

enter image description here

到目前为止,这是我的代码:

// MyHeaderReusableView.m

// my gesture recognizer's action
- (IBAction)onHeaderTap:(UITapGestureRecognizer *)sender
{
self.listIntro.numberOfLines = 0;

// force -layoutSubviews to run again
[self setNeedsLayout];
[self layoutIfNeeded];
}

- (void)layoutSubviews
{
[super layoutSubviews];

self.listTitle.preferredMaxLayoutWidth = self.listTitle.frame.size.width;
self.listIntro.preferredMaxLayoutWidth = self.listIntro.frame.size.width;
[self layoutIfNeeded];

CGFloat height = [self systemLayoutSizeFittingSize:UILayoutFittingCompressedSize].height;

self.frame = ({
CGRect headerFrame = self.frame;
headerFrame.size.height = height;
headerFrame;
});

NSLog(@"height: %@", @(height));
}

当我在 layoutSubviews 末尾记录 height 时,它的值为 149,而标签被截断并且 numberOfLines 设置为 3。点击 headerView 后,将 numberOfLines 设置为 0,并强制进行布局传递,然后高度记录为 163.5。太棒了!

唯一的问题是整个 headerView 没有增长,单元格也没有被压下。

如何动态更改 collectionView 的补充 View (最好是动画)的高度?

我知道 UICollectionViewFlowLayout 的 headerReferenceSizecollectionView:layout:referenceSizeForHeaderInSection: 但不太确定在这种情况下我将如何使用它们。

最佳答案

我有一些东西在工作,但我承认,感觉很糟糕。我觉得这可以通过标准 CollectionView(和相关元素)API + Hook 到标准布局/显示失效来实现,但我就是无法让它工作。

唯一可以调整我的 headerView 大小的是设置我的 Collection View 的流布局的 headerReferenceSize。不幸的是,我无法从我的 UICollectionReusableView 实例访问我的 Collection View 或其流布局,因此我必须创建一个委托(delegate)方法来传回正确的高度。

这是我现在拥有的:

// in MyHeaderReusableView.m
//
// my UITapGestureRecognizer's action
- (IBAction)onHeaderTap:(UITapGestureRecognizer *)sender
{
self.listIntro.numberOfLines = 0;
}

- (void)layoutSubviews
{
[super layoutSubviews];

self.listTitle.preferredMaxLayoutWidth = self.listTitle.frame.size.width;
self.listIntro.preferredMaxLayoutWidth = self.listIntro.frame.size.width;

CGFloat height = [self systemLayoutSizeFittingSize:UILayoutFittingCompressedSize].height;

self.frame = ({
CGRect headerFrame = self.frame;
headerFrame.size.height = height;
headerFrame;
});

if (self.resizeDelegate) {
[self.resizeDelegate wanderlistDetailHeaderDidResize:self.frame.size];
}
}

// in my viewController subclass which owns the UICollectionView:
- (void)wanderlistDetailHeaderDidResize:(CGSize)newSize
{
UICollectionViewFlowLayout *flowLayout = (UICollectionViewFlowLayout *)self.collectionView.collectionViewLayout;

// this is the key line
flowLayout.headerReferenceSize = newSize;

// this doesn't look beautiful but it's the best i can do for now. I would love for just the bottom of the frame to animate down, but instead, all the contents in the header (the top labels) have a crossfade effect applied.
[UIView animateWithDuration:0.3 animations:^{
[self.collectionView layoutIfNeeded];
}];
}

正如我所说,这不是我正在寻找的解决方案,但仍然是一个可行的解决方案。

关于ios - 动态调整 UICollectionView 的补充 View (包含多行 UILabel 的),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/29991624/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com