如何更改 UICollectionViewCell 的框架以在点击时显示隐藏的按钮?
How to change frame of UICollectionViewCell to reveal hidden button on tap?
我有一个自定义 UICollectionViewCell
,它有一个 UIImage
和一个 UIButton
。
扩展单元格的框架为 110 x 60。默认情况下为 60x60。
当应用程序加载时,我希望单元格以 60x60 开始并仅显示图像。当点击单元格时,单元格将更新为 110x60 帧并显示图像旁边的 UIButton。
目前,我的应用程序确实加载并且单元格为 60x60,但由于我的自动布局设置,图像被压扁并且按钮为全尺寸。如果我点击单元格,它会更新它的框架并且看起来很棒。
目标是先看到图像,然后在单元格更新其框架后看到按钮。
我还希望能够再次点击单元格并将其调整回 60x60,隐藏按钮并只显示图像。
这是我目前正在尝试的:
func collectionView(_ collectionView: UICollectionView, didSelectItemAt indexPath: IndexPath) {
collectionView.performBatchUpdates(nil, completion: nil)
}
func collectionView(_ collectionView: UICollectionView,
layout collectionViewLayout: UICollectionViewLayout,
sizeForItemAt indexPath: IndexPath) -> CGSize {
switch collectionView.indexPathsForSelectedItems?.first {
case .some(indexPath):
return CGSize(width: 110.0, height: 60.0)
default:
return CGSize(width: 60.0, height: 60.0)
}
}
根据请求,我的 CollectionViewCell Class 代码:
class myCollectionViewCell: UICollectionViewCell {
@IBOutlet weak var myImageView: UIImageView!
@IBOutlet weak var myButton: UIButton!
var myCellDelegate : myCollectionViewCellDelegate?
override func awakeFromNib() {
super.awakeFromNib()
self.layer.cornerRadius = 30
self.layer.masksToBounds = true
myImageView.layer.cornerRadius = myImageView.frame.width / 2
myImageView.layer.masksToBounds = true
}
// MARK: - Actions
@IBAction func myButtonTapped(_ sender: Any) {
self.myCellDelegate?.actionClicked(self)
}
}
请注意,内容不多,所以不确定是否有帮助。我只是调整单元格和我的图像的 cornerRadius,然后为按钮的操作创建一个委托。
我认为很大程度上取决于您在 nib 文件中的限制。
选项 1
界面生成器 > select 你的 ImageView > 右面板 > 大小检查器 > 玩转 "content Hugging Priority" 和 "content Compression Resistance"
特别是 imageView 的水平压缩阻力必须大于按钮的压缩阻力。
系统根据为这两个参数指示的优先级选择要拉伸的视图。
选项 2
Top
+-------------+--------+
| | |
| | |
Left| (Image) |(Button)|Right
| | |
| | |
+-------------+--------+
Bottom
<------------->
Width
Left, Top, Right, Bottom ---> constraint to the cell contentView
Width ---> set to a fixed 60
(Remember to enable clipsToBounds)
当单元格放大时,您的按钮就会出现。
您最终可以添加动画。
我有一个自定义 UICollectionViewCell
,它有一个 UIImage
和一个 UIButton
。
扩展单元格的框架为 110 x 60。默认情况下为 60x60。
当应用程序加载时,我希望单元格以 60x60 开始并仅显示图像。当点击单元格时,单元格将更新为 110x60 帧并显示图像旁边的 UIButton。
目前,我的应用程序确实加载并且单元格为 60x60,但由于我的自动布局设置,图像被压扁并且按钮为全尺寸。如果我点击单元格,它会更新它的框架并且看起来很棒。
目标是先看到图像,然后在单元格更新其框架后看到按钮。
我还希望能够再次点击单元格并将其调整回 60x60,隐藏按钮并只显示图像。
这是我目前正在尝试的:
func collectionView(_ collectionView: UICollectionView, didSelectItemAt indexPath: IndexPath) {
collectionView.performBatchUpdates(nil, completion: nil)
}
func collectionView(_ collectionView: UICollectionView,
layout collectionViewLayout: UICollectionViewLayout,
sizeForItemAt indexPath: IndexPath) -> CGSize {
switch collectionView.indexPathsForSelectedItems?.first {
case .some(indexPath):
return CGSize(width: 110.0, height: 60.0)
default:
return CGSize(width: 60.0, height: 60.0)
}
}
根据请求,我的 CollectionViewCell Class 代码:
class myCollectionViewCell: UICollectionViewCell {
@IBOutlet weak var myImageView: UIImageView!
@IBOutlet weak var myButton: UIButton!
var myCellDelegate : myCollectionViewCellDelegate?
override func awakeFromNib() {
super.awakeFromNib()
self.layer.cornerRadius = 30
self.layer.masksToBounds = true
myImageView.layer.cornerRadius = myImageView.frame.width / 2
myImageView.layer.masksToBounds = true
}
// MARK: - Actions
@IBAction func myButtonTapped(_ sender: Any) {
self.myCellDelegate?.actionClicked(self)
}
}
请注意,内容不多,所以不确定是否有帮助。我只是调整单元格和我的图像的 cornerRadius,然后为按钮的操作创建一个委托。
我认为很大程度上取决于您在 nib 文件中的限制。
选项 1
界面生成器 > select 你的 ImageView > 右面板 > 大小检查器 > 玩转 "content Hugging Priority" 和 "content Compression Resistance"
特别是 imageView 的水平压缩阻力必须大于按钮的压缩阻力。
系统根据为这两个参数指示的优先级选择要拉伸的视图。
选项 2
Top
+-------------+--------+
| | |
| | |
Left| (Image) |(Button)|Right
| | |
| | |
+-------------+--------+
Bottom
<------------->
Width
Left, Top, Right, Bottom ---> constraint to the cell contentView
Width ---> set to a fixed 60
(Remember to enable clipsToBounds)
当单元格放大时,您的按钮就会出现。 您最终可以添加动画。