附加视图被插入到从 Xib 加载的 UICollectionView 中
Additional View getting inserted into UICollectionView loaded from Xib
我在为 UICollectionViewCells 使用 Xib 时遇到一个奇怪的问题。问题是正在创建一个额外的视图,它似乎在一切之上,使我的手势和 IBActions 变得无用。
这是我的设置:
我有一个带有 UICollectionView 的 UIViewController。
在情节提要中,UICollectionView 有一个 class "MyCell" 的单元格,重用 ID "cell"
在cellForItemAtIndexPath
中,我只有return[collectionView dequeueReusableCellWithReuseIdentifier:@"cell" forIndexPath:indexPath]
的结果。我还在 numberOfItemsInSection
.
中硬编码了 30 个项目
就是这样。除此之外,我还有 MyCell.h、MyCell.m 和 MyCell.xib.
xib 包含一个 UIButton,其 Touch Up Inside 事件设置为调用 buttonPressed
IBAction。视图本身设置为 class MyCell,标签设置为 123(我们将在下面说明原因)。
在 MyCell.m 中,我将 awakeAfterUsingCoder
覆盖为 return [MyCell initView:self]
。 initView
的定义在底部。但它基本上是从 Xib 加载视图。
就是这样。
当我 运行 应用程序时,会显示 30 个单元格,所有单元格都带有按钮,但是当按下按钮时,没有任何反应。经过 大量 的调查,我发现在单元格中添加了一个额外的 UIView,它位于按钮的顶部,并且覆盖了整个内容。
如果我在 awakeAfterUsingCoder
中添加下面的 for 循环,那么该按钮将再次起作用。
- (MyCell *)awakeAfterUsingCoder:(NSCoder *)aDecoder
{
MyCell *cell = [MyCell initView:self];
for(UIView *v in cell.subviews){
if(![v isKindOfClass:[UIButton class]]) [v removeFromSuperview];
}
return cell;
}
我的问题是:那个视图是什么,为什么会出现???尽管我可以通过删除该视图来使一切正常工作,但感觉就像一个 hack。
谢谢!如有必要,我可以回答任何其他问题。
+ (id)initView:(UIView *)viewToInit
{
UIView *viewToReturn;
if(viewToInit.tag != 123){
//If we're in the storyboard codepath
//Initialize from the xib.
//If the code below is failing, we probably forgot the 666 tag :/
viewToReturn = [[[NSBundle mainBundle] loadNibNamed:NSStringFromClass([viewToInit class])
owner:nil
options:nil] firstObject];
//copy frame, autoresizing, and layour items.
viewToReturn.frame = viewToInit.frame;
viewToReturn.autoresizingMask = viewToInit.autoresizingMask;
viewToReturn.translatesAutoresizingMaskIntoConstraints = viewToInit.translatesAutoresizingMaskIntoConstraints;
for (NSLayoutConstraint *constraint in viewToInit.constraints){
id firstItem = constraint.firstItem;
if (firstItem == viewToInit){
firstItem = viewToReturn;
}
id secondItem = constraint.secondItem;
if (secondItem == viewToInit){
secondItem = viewToReturn;
}
[viewToReturn addConstraint:[NSLayoutConstraint constraintWithItem:firstItem
attribute:constraint.firstAttribute
relatedBy:constraint.relation
toItem:secondItem
attribute:constraint.secondAttribute
multiplier:constraint.multiplier
constant:constraint.constant]];
}
}else{
//otherwise do nothing and just return what was passed in
viewToReturn = viewToInit;
}
return viewToReturn;
}
好吧,经过很长时间的黑客攻击来解决这个问题,我终于弄明白了。
问题是 UICollectionViewCell 的 contentView 被插入到我的视图之上。这对我来说很奇怪,因为这不会发生在也有内容视图的 UITableViewCells 上。
我当时所做的是将所有内容都放在 "container" 视图中,然后在初始化时将该容器视图移动到 contentView 中,这样就解决了问题。
我还是不明白为什么会这样。在我看来,我所有的视图都应该添加到 contentView 中(就像 table 的单元格所做的那样),但至少我现在可以解决它。
我自己也遇到过这个问题,答案就在cell nib文件中。如果您已经创建了一个笔尖并且正在使用作为单元格包含的库存 UIView,那么这就是您的问题所在。这个 UIView 需要立即删除并替换为新拖入的 UICollectionViewCell。这将是您的手机,您可以在没有其他问题的情况下添加您心中的内容。
我在为 UICollectionViewCells 使用 Xib 时遇到一个奇怪的问题。问题是正在创建一个额外的视图,它似乎在一切之上,使我的手势和 IBActions 变得无用。
这是我的设置:
我有一个带有 UICollectionView 的 UIViewController。
在情节提要中,UICollectionView 有一个 class "MyCell" 的单元格,重用 ID "cell"
在
cellForItemAtIndexPath
中,我只有return[collectionView dequeueReusableCellWithReuseIdentifier:@"cell" forIndexPath:indexPath]
的结果。我还在numberOfItemsInSection
. 中硬编码了 30 个项目
就是这样。除此之外,我还有 MyCell.h、MyCell.m 和 MyCell.xib.
xib 包含一个 UIButton,其 Touch Up Inside 事件设置为调用
buttonPressed
IBAction。视图本身设置为 class MyCell,标签设置为 123(我们将在下面说明原因)。在 MyCell.m 中,我将
awakeAfterUsingCoder
覆盖为 return[MyCell initView:self]
。initView
的定义在底部。但它基本上是从 Xib 加载视图。
就是这样。
当我 运行 应用程序时,会显示 30 个单元格,所有单元格都带有按钮,但是当按下按钮时,没有任何反应。经过 大量 的调查,我发现在单元格中添加了一个额外的 UIView,它位于按钮的顶部,并且覆盖了整个内容。
如果我在 awakeAfterUsingCoder
中添加下面的 for 循环,那么该按钮将再次起作用。
- (MyCell *)awakeAfterUsingCoder:(NSCoder *)aDecoder
{
MyCell *cell = [MyCell initView:self];
for(UIView *v in cell.subviews){
if(![v isKindOfClass:[UIButton class]]) [v removeFromSuperview];
}
return cell;
}
我的问题是:那个视图是什么,为什么会出现???尽管我可以通过删除该视图来使一切正常工作,但感觉就像一个 hack。
谢谢!如有必要,我可以回答任何其他问题。
+ (id)initView:(UIView *)viewToInit
{
UIView *viewToReturn;
if(viewToInit.tag != 123){
//If we're in the storyboard codepath
//Initialize from the xib.
//If the code below is failing, we probably forgot the 666 tag :/
viewToReturn = [[[NSBundle mainBundle] loadNibNamed:NSStringFromClass([viewToInit class])
owner:nil
options:nil] firstObject];
//copy frame, autoresizing, and layour items.
viewToReturn.frame = viewToInit.frame;
viewToReturn.autoresizingMask = viewToInit.autoresizingMask;
viewToReturn.translatesAutoresizingMaskIntoConstraints = viewToInit.translatesAutoresizingMaskIntoConstraints;
for (NSLayoutConstraint *constraint in viewToInit.constraints){
id firstItem = constraint.firstItem;
if (firstItem == viewToInit){
firstItem = viewToReturn;
}
id secondItem = constraint.secondItem;
if (secondItem == viewToInit){
secondItem = viewToReturn;
}
[viewToReturn addConstraint:[NSLayoutConstraint constraintWithItem:firstItem
attribute:constraint.firstAttribute
relatedBy:constraint.relation
toItem:secondItem
attribute:constraint.secondAttribute
multiplier:constraint.multiplier
constant:constraint.constant]];
}
}else{
//otherwise do nothing and just return what was passed in
viewToReturn = viewToInit;
}
return viewToReturn;
}
好吧,经过很长时间的黑客攻击来解决这个问题,我终于弄明白了。
问题是 UICollectionViewCell 的 contentView 被插入到我的视图之上。这对我来说很奇怪,因为这不会发生在也有内容视图的 UITableViewCells 上。
我当时所做的是将所有内容都放在 "container" 视图中,然后在初始化时将该容器视图移动到 contentView 中,这样就解决了问题。
我还是不明白为什么会这样。在我看来,我所有的视图都应该添加到 contentView 中(就像 table 的单元格所做的那样),但至少我现在可以解决它。
我自己也遇到过这个问题,答案就在cell nib文件中。如果您已经创建了一个笔尖并且正在使用作为单元格包含的库存 UIView,那么这就是您的问题所在。这个 UIView 需要立即删除并替换为新拖入的 UICollectionViewCell。这将是您的手机,您可以在没有其他问题的情况下添加您心中的内容。