ios – 带有ImageView的UIScrollView不能垂直滚动

前端之家收集整理的这篇文章主要介绍了ios – 带有ImageView的UIScrollView不能垂直滚动前端之家小编觉得挺不错的,现在分享给大家,也给大家做个参考。
我有一个UI ImageView,它的图像大于屏幕尺寸.我有这个UIImageView作为UIScrollView的子视图.现在,我无法向下滚动.查看整个图像.但缩放功能正常.
  1. @IBOutlet weak var scrollView: UIScrollView!
  2.  
  3. var imageView = UIImageView();
  4.  
  5. override func viewDidLoad() {
  6. super.viewDidLoad()
  7. }
  8.  
  9. func centerScrollViewContents(){
  10. let boundsSize = scrollView.bounds.size
  11. var contentsFrame = imageView.frame
  12.  
  13. if contentsFrame.size.width < boundsSize.width {
  14. contentsFrame.origin.x = (boundsSize.width - contentsFrame.size.width) / 2
  15. }
  16. else {
  17. contentsFrame.origin.x = 0
  18. }
  19.  
  20. if contentsFrame.size.height < boundsSize.height {
  21. contentsFrame.origin.y = (boundsSize.height - contentsFrame.size.height) / 2
  22. }
  23. else {
  24. contentsFrame.origin.y = 0
  25. }
  26.  
  27. imageView.frame = contentsFrame
  28. // scrollView.frame = contentsFrame
  29. }
  30.  
  31. func scrollViewDidZoom(scrollView: UIScrollView) {
  32. centerScrollViewContents()
  33. }
  34.  
  35. func viewForZoomingInScrollView(scrollView: UIScrollView) -> UIView? {
  36. return imageView
  37. }
  38.  
  39. override func didReceiveMemoryWarning() {
  40. super.didReceiveMemoryWarning()
  41.  
  42. // Dispose of any resources that can be recreated.
  43. }
  44.  
  45. override func viewDidAppear(animated: Bool) {
  46.  
  47. scrollView.delegate = self
  48. imageView.frame = CGRectMake(0,scrollView.frame.size.width,scrollView.frame.size.height)
  49.  
  50. // imageView.contentMode = UIViewContentMode.ScaleAspectFill
  51. // imageView.clipsToBounds = true
  52. imageView.image = UIImage(named: imgstr)
  53.  
  54. var imagee = UIImage(named: imgstr)
  55. let size = imagee?.size
  56. // imageView.frame = CGRectMake(0,size.width!,size.height!)
  57. imageView.contentMode = .Top
  58. scrollView.addSubview(imageView)
  59.  
  60. scrollView.contentSize = size!
  61. let scrollViewFrame = scrollView.frame
  62. let scaleWidth = scrollViewFrame.size.width / scrollView.contentSize.width
  63. let scaleHeight = scrollViewFrame.size.height / scrollView.contentSize.height
  64. let minScale = min(scaleHeight,scaleWidth)
  65.  
  66. scrollView.minimumZoomScale = 1
  67. scrollView.maximumZoomScale = 5
  68. scrollView.zoomScale = minScale
  69.  
  70. centerScrollViewContents()
  71. }

解决方法

您必须解决UIScrollView工作的两个主要问题

>在初始化UIScrollView的所有数据的内部存在一个问题,我的意思是函数viewDidAppear.
>您必须为UIScrollView设置约束,如Top,Bottom,Left和Right为0,尊重您的SuperView.

如果将代码放在viewDidAppear内部的函数viewDidLoad中并删除函数viewDidAppear,它可以正常工作.喜欢以下方式:

  1. override func viewDidLoad() {
  2. super.viewDidLoad()
  3.  
  4.  
  5. scrollView.delegate = self
  6. imageView.frame = CGRectMake(0,scrollView.frame.size.height)
  7.  
  8. // imageView.contentMode = UIViewContentMode.ScaleAspectFill
  9. // imageView.clipsToBounds = true
  10. imageView.image = UIImage(named: "imgstr.jpg")
  11.  
  12. var imagee = UIImage(named: "imgstr.jpg")
  13. let size = imagee?.size
  14. // imageView.frame = CGRectMake(0,scaleWidth)
  15.  
  16. scrollView.minimumZoomScale = 1
  17. scrollView.maximumZoomScale = 5
  18. scrollView.zoomScale = minScale
  19.  
  20. centerScrollViewContents()
  21. }

您还必须在Storyboard中为UIScrollView设置约束

我认为问题在于以下区别:

> viewDidAppear在视图实际可见时被调用,并且可以在视图控制器的生命周期中多次调用(例如,当模式视图控制器被关闭并且视图再次可见时).您可以在此处执行任何布局操作或在UI中执行任何绘图 – 例如,呈现模态视图控制器.但是,你在这里做的任何事都应该是可重复的.最好不要在这里保留东西,否则你会得到记忆
如果在视图消失时不释放它们,则会泄漏.
>当视图控制器首次加载到内存中时,viewDidLoad只调用一次.这是您希望实例化任何实例变量并构建在此视图控制器的整个生命周期中存在的任何视图的位置.但是,此时通常尚未显示该视图.

如果您有任何问题,我有一个项目准备提交给Github,如果你想看到它.

UPDATE:
After test it again your code,I resume your error to less code. Your code work fine,if you put your line imageView.frame = CGRectMake(0,size!.width,size!.height) your code works fine without contraints.

像这样的东西:

  1. override func viewDidAppear(animated: Bool) {
  2.  
  3.  
  4. scrollView.delegate = self
  5.  
  6. // imageView.contentMode = UIViewContentMode.ScaleAspectFill
  7. // imageView.clipsToBounds = true
  8. imageView.image = UIImage(named: "imgstr.jpg")
  9.  
  10. var imagee = UIImage(named: "imgstr.jpg")
  11. let size = imagee?.size
  12.  
  13. // This line should be here!!!
  14. imageView.frame = CGRectMake(0,size!.height)
  15. imageView.contentMode = .Top
  16. scrollView.addSubview(imageView)
  17.  
  18. scrollView.contentSize = size!
  19. let scrollViewFrame = scrollView.frame
  20. let scaleWidth = scrollViewFrame.size.width / scrollView.contentSize.width
  21. let scaleHeight = scrollViewFrame.size.height / scrollView.contentSize.height
  22. let minScale = min(scaleHeight,scaleWidth)
  23.  
  24. scrollView.minimumZoomScale = 1
  25. scrollView.maximumZoomScale = 5
  26. scrollView.zoomScale = minScale
  27.  
  28. centerScrollViewContents()
  29.  
  30. }

关键是在前面的代码中,您将图像的帧设置为scrollView的帧,而不是大于scrollView的图像大小.

我希望这对你有帮助.

猜你在找的iOS相关文章