Ios UICollectionViewCell中的句柄滚动视图大小
我正在制作一个水平的Ios UICollectionViewCell中的句柄滚动视图大小,ios,swift,uiscrollview,uicollectionview,Ios,Swift,Uiscrollview,Uicollectionview,我正在制作一个水平的UICollectionView,在UICollectionViewCell中我有一个scrollview,在scrollview中我有一个imageView 我遇到的问题是,当我放大imageView时,scrollView占据了所有单元格的大小,因此它不适合图像大小的高度和宽度。因此,通过上下滚动图像从scrollView中消失,我不知道我的代码中出了什么问题 MyColectionViewCell代码: class CollectionViewCell: UIColle
UICollectionView
,在UICollectionViewCell
中我有一个scrollview,在scrollview中我有一个imageView
我遇到的问题是,当我放大imageView时,scrollView占据了所有单元格的大小,因此它不适合图像大小的高度和宽度。因此,通过上下滚动图像从scrollView中消失,我不知道我的代码中出了什么问题
MyColectionViewCell
代码:
class CollectionViewCell: UICollectionViewCell {
@IBOutlet var scrollView: UIScrollView!
@IBOutlet var ImageV: UIImageView!
}
CollectionView代码:
func collectionView(collectionView: UICollectionView, cellForItemAtIndexPath indexPath: NSIndexPath) -> UICollectionViewCell {
let cell = collectionView.dequeueReusableCellWithReuseIdentifier("cell", forIndexPath: indexPath) as! CollectionViewCell
cell.scrollView.contentMode = UIViewContentMode.ScaleAspectFit
cell.scrollView.delegate = self
cell.ImageV.image = UIImage(named: array[indexPath.row])
cell.ImageV.contentMode = UIViewContentMode.ScaleAspectFit
cell.scrollView.minimumZoomScale = 1
cell.scrollView.maximumZoomScale = 4;
cell.scrollView.contentSize = cell.ImageV.frame.size
return cell
}
func collectionView(collectionView: UICollectionView, layout collectionViewLayout: UICollectionViewLayout, sizeForItemAtIndexPath indexPath: NSIndexPath) -> CGSize {
return CGSize(width: self.collectionView.frame.size.width , height: self.collectionView.frame.size.height - 100)
}
func viewForZoomingInScrollView(scrollView: UIScrollView) -> UIView? {
let indexPath = NSIndexPath(forItem: Int(currentIndex), inSection: 0)
if let cell1 = self.collectionView.cellForItemAtIndexPath(indexPath) {
let cell = cell1 as! CollectionViewCell
let boundsSize = cell.scrollView.bounds.size
var contentsFrame = cell.ImageV.frame
if contentsFrame.size.width < boundsSize.width{
contentsFrame.origin.x = (boundsSize.width - contentsFrame.size.width) / 2
}else{
contentsFrame.origin.x = 0
}
if contentsFrame.size.height < boundsSize.height {
contentsFrame.origin.y = (boundsSize.height - contentsFrame.size.height) / 2
}else{
contentsFrame.origin.y = 0
}
return cell.ImageV
}
return UIView()
}
func scrollViewDidEndDecelerating(scrollView: UIScrollView) {
currentIndex = self.collectionView.contentOffset.x / self.collectionView.frame.size.width;
oldcell = currentIndex - 1
let indexPath = NSIndexPath(forItem: Int(oldcell), inSection: 0)
if let cell1 = self.collectionView.cellForItemAtIndexPath(indexPath) {
let cell = cell1 as! CollectionViewCell
cell.scrollView.zoomScale = 0
}
}
func collectionView(collectionView:UICollectionView,cellForItemAtIndexPath indepath:nsindepath)->UICollectionViewCell{
让cell=collectionView.dequeueReusableCellWithReuseIdentifier(“cell”,forIndexPath:indexPath)作为!CollectionViewCell
cell.scrollView.contentMode=UIViewContentMode.ScaleSpectFit
cell.scrollView.delegate=self
cell.ImageV.image=UIImage(命名为:数组[indexPath.row])
cell.ImageV.contentMode=UIViewContentMode.ScaleSpectFit
cell.scrollView.minimumZoomScale=1
cell.scrollView.maximumZoomScale=4;
cell.scrollView.contentSize=cell.ImageV.frame.size
返回单元
}
func collectionView(collectionView:UICollectionView,布局collectionViewLayout:UICollectionViewLayout,SizeFormiteIndeXPath indexPath:NSIndexPath)->CGSize{
返回CGSize(宽度:self.collectionView.frame.size.width,高度:self.collectionView.frame.size.height-100)
}
func viewForZoomingInScrollView(滚动视图:UIScrollView)->UIView?{
让indexPath=NSIndexPath(forItem:Int(currentIndex),第0节)
如果让cell1=self.collectionView.cellForItemAtIndexPath(indexPath){
让单元格=单元格1为!CollectionViewCell
让boundsSize=cell.scrollView.bounds.size
var contentsFrame=cell.ImageV.frame
如果contentsFrame.size.width
图像预览:
我的项目在这里找到:您需要在滚动视图上设置
内容插入。现在发生的是UIScrollView
的contentSize
最初设置为与屏幕大小和其中的图像相匹配。当您在滚动视图上放大时,contentSize会成比例地展开,因此当您一直向外放大时,照片上方和下方的黑色区域会随着您的放大而展开。换言之,你正在扩大你的图像可以去的区域。如果调整contentInset
,它将引入死区,并且不允许滚动视图将图像移出窗口
公共函数scrollViewDidZoom(scrollView:UIScrollView){
让imageViewSize=imageView.frame.size
让scrollViewSize=scrollView.bounds.size
让verticalPadding=imageViewSize.height=0{
//将图像居中显示在屏幕上
scrollView.contentInset=UIEdgeInSet(顶部:垂直填充,左侧:水平填充,底部:垂直填充,右侧:水平填充)
}否则{
//将图像平移限制在屏幕范围内
scrollView.contentSize=imageViewSize
}
}
这看起来几乎和我帮助管理的开源Cocoapod一样。看看的代码,你应该得到一个很好的想法如何做到这一点。(如果您愿意,也可以随意使用cocoapod!)首先,让我们从保存您的
UICollectionView的UIViewController
开始:
定义用于保存集合视图布局的变量:
var flowLayout:UICollectionViewFlowLayout = UICollectionViewFlowLayout()
您必须覆盖viewWillLayoutSubviews
,这将处理collectionView大小
override func viewWillLayoutSubviews() {
super.viewWillLayoutSubviews()
flowLayout.itemSize = CGSize(width: view.frame.width, height:view.frame.height)
}
此外,您还需要覆盖viewdilayoutsubviews
以处理每个新单元格的大小,将其设置为默认大小:
override func viewDidLayoutSubviews() {
if let currentCell = imageCollectionView.cellForItemAtIndexPath(desiredIndexPath) as? GalleryCell {
currentCell.configureForNewImage()
}
}
在viewdiload
中,将collectionView设置为水平的流布局:
// Set up flow layout
flowLayout.scrollDirection = UICollectionViewScrollDirection.Horizontal
flowLayout.minimumInteritemSpacing = 0
flowLayout.minimumLineSpacing = 0
// Set up collection view
imageCollectionView = UICollectionView(frame: CGRect(x: 0, y: 0, width: self.view.frame.width, height: self.view.frame.height), collectionViewLayout: flowLayout)
imageCollectionView.translatesAutoresizingMaskIntoConstraints = false
imageCollectionView.registerClass(GalleryCell.self, forCellWithReuseIdentifier: "GalleryCell")
imageCollectionView.dataSource = self
imageCollectionView.delegate = self
imageCollectionView.pagingEnabled = true
view.addSubview(imageCollectionView)
imageCollectionView.contentSize = CGSize(width: 1000.0, height: 1.0)
在UICollectionView
方法cellForItemAtIndexPath
中,仅加载图像,不进行任何设置:
cell.image = UIImage(named: array[indexPath.row])
现在让我们转到GalleryCell类,并在缩放时处理scrollView:
class GalleryCell: UICollectionViewCell, UIScrollViewDelegate {
var image:UIImage? {
didSet {
configureForNewImage()
}
}
var scrollView: UIScrollView
let imageView: UIImageView
override init(frame: CGRect) {
imageView = UIImageView()
imageView.translatesAutoresizingMaskIntoConstraints = false
scrollView = UIScrollView(frame: frame)
scrollView.translatesAutoresizingMaskIntoConstraints = false
super.init(frame: frame)
contentView.addSubview(scrollView)
contentView.addConstraints(scrollViewConstraints)
scrollView.addSubview(imageView)
scrollView.delegate = self
scrollView.maximumZoomScale = 4
}
required public init?(coder aDecoder: NSCoder) {
fatalError("init(coder:) has not been implemented")
}
internal func configureForNewImage() {
imageView.image = image
imageView.sizeToFit()
setZoomScale()
scrollViewDidZoom(scrollView)
}
public func viewForZoomingInScrollView(scrollView: UIScrollView) -> UIView? {
return imageView
}
public func scrollViewDidZoom(scrollView: UIScrollView) {
let imageViewSize = imageView.frame.size
let scrollViewSize = scrollView.bounds.size
let verticalPadding = imageViewSize.height < scrollViewSize.height ? (scrollViewSize.height - imageViewSize.height) / 2 : 0
let horizontalPadding = imageViewSize.width < scrollViewSize.width ? (scrollViewSize.width - imageViewSize.width) / 2 : 0
if verticalPadding >= 0 {
// Center the image on screen
scrollView.contentInset = UIEdgeInsets(top: verticalPadding, left: horizontalPadding, bottom: verticalPadding, right: horizontalPadding)
} else {
// Limit the image panning to the screen bounds
scrollView.contentSize = imageViewSize
}
}
class GalleryCell:UICollectionViewCell,UIScrollViewDelegate{
var图像:UIImage{
迪塞特{
configureForNewImage()
}
}
变量scrollView:UIScrollView
让imageView:UIImageView
重写初始化(帧:CGRect){
imageView=UIImageView()
imageView.TranslatesAutoResizezingMaskintoConstraints=false
scrollView=UIScrollView(帧:帧)
scrollView.TranslatesAutoResizezingMaskintoConstraints=false
super.init(frame:frame)
contentView.addSubview(滚动视图)
contentView.addConstraints(scrollViewConstraints)
scrollView.addSubview(imageView)
scrollView.delegate=self
scrollView.maximumZoomScale=4
}
所需的公共初始化?(编码者aDecoder:NSCoder){
fatalError(“初始化(编码者:)尚未实现”)
}
int