简体   繁体   English

如何在iOS Swift中水平滚动图像

[英]How to scroll images horizontally in iOS swift

I have an imageview called "cardImgView" in that I want to load two images by scrolling horizontally, I have tried the following way, in this case I can able to scroll only to up and down and the images also not changing, anyone have idea how to do this correctly. 我有一个名为“ cardImgView”的图像视图,我想通过水平滚动来加载两个图像,我尝试了以下方法,在这种情况下,我只能上下滚动,图像也不会改变,任何人都知道如何正确做到这一点。

let img: UIImage = self.dataDict.object(forKey: kCardImgFront) as! UIImage
let img2:UIImage = self.dataDict.object(forKey: kCardImgBack) as! UIImage
imgArray = [img, img2]        

for i in 0..<imgArray.count{           
    cardImgView?.image = imgArray[i]                        
    scrollView.contentSize.width = scrollView.frame.width * CGFloat(i + 1)
    scrollView.addSubview(cardImgView!)
}

thanks in advance. 提前致谢。

I modified my code and tried as follows and its working now. 我修改了我的代码,并尝试如下操作,现在可以正常工作了。 with page contrlller 与页面控制

   let imgArray = [UIImage]()
   let img: UIImage = self.dataDict.object(forKey: kCardImgFront) as! UIImage
   let img2:UIImage = self.dataDict.object(forKey: kCardImgBack) as! UIImage

   imgArray = [img, img2]        
   for i in 0..<imgArray.count { 

let imageView = UIImageView()
imageView.image = imgArray[i]                        
let xPosition = self.view.frame.width * CGFloat(i)
imageView.frame = CGRect(x: xPosition, y: 0, width: 
self.scrollView.frame.width + 50, height: self.scrollView.frame.height)
scrollView.contentSize.width = scrollView.frame.width * CGFloat(i + 1)
scrollView.addSubview(imageView)

 }

self.scrollView.delegate = self

func scrollViewDidScroll(_ scrollView: UIScrollView){

pageController.currentPage = Int(self.scrollView.contentOffset.x / 
  CGFloat(4))
      }

First, as I commented, you are currently using a single UIImageView --- so each time through your for-loop you are just replacing the .image of that one image view. 首先,正如我所评论的,您当前使用的是一个UIImageView ---因此,每次通过for循环时,您都只是在替换那个图像视图的.image

Second, you will be much better off using auto-layout and constraints, instead of trying to explicitly set frames and the scrollView's contentSize. 其次,使用自动布局和约束会更好,而不是尝试显式设置框架和scrollView的contentSize。

Third, UIStackView is ideal for your use case - adding multiple images that you want to horizontally scroll. 第三, UIStackView非常适合您的用例-添加要水平滚动的多个图像。

So, the general idea is: 因此,总体思路是:

  • add a scroll view 添加滚动视图
  • add a stack view to the scroll view 将堆栈视图添加到滚动视图
  • use constraints to make the stack view control the scroll view's contentSize 使用约束使堆栈视图控制滚动视图的contentSize
  • create a new UIImageView for each image 为每个图像创建一个新的UIImageView
  • add each image view to the stack view 将每个图像视图添加到堆栈视图

Here is a simple example that you can run in a Playground page to see how it works. 这是一个简单的示例,您可以在Playground页面中运行以查看其工作方式。 If you add your own images named image1.png and image2.png to the playground's resources, they will be used (otherwise, this example creates solid blue and solid green images): 如果将自己的名为image1.png和image2.png的图像添加到游乐场的资源中,则将使用它们(否则,本示例将创建蓝色和绿色实心图像):

import UIKit
import PlaygroundSupport

// UIImage extension to create a new, solid-color image
public extension UIImage {
    public convenience init?(color: UIColor, size: CGSize = CGSize(width: 1, height: 1)) {
        let rect = CGRect(origin: .zero, size: size)
        UIGraphicsBeginImageContextWithOptions(rect.size, false, 0.0)
        color.setFill()
        UIRectFill(rect)
        let image = UIGraphicsGetImageFromCurrentImageContext()
        UIGraphicsEndImageContext()
        guard let cgImage = image?.cgImage else { return nil }
        self.init(cgImage: cgImage)
    }
}

class TestViewController : UIViewController {

    override func viewDidLoad() {
        super.viewDidLoad()

        // create a UIScrollView
        let scrollView = UIScrollView()

        // we will set the auto-layout constraints
        scrollView.translatesAutoresizingMaskIntoConstraints = false

        // set background color so we can see the scrollView when the images are scrolled
        scrollView.backgroundColor = .orange

        // add the scrollView to the view
        view.addSubview(scrollView)

        // pin scrollView 20-pts from top/bottom/leading/trailing
        scrollView.leadingAnchor.constraint(equalTo: view.leadingAnchor, constant: 20.0).isActive = true
        scrollView.topAnchor.constraint(equalTo: view.topAnchor, constant: 20.0).isActive = true
        scrollView.trailingAnchor.constraint(equalTo: view.trailingAnchor, constant: -20.0).isActive = true
        scrollView.bottomAnchor.constraint(equalTo: view.bottomAnchor, constant: -20.0).isActive = true

        // create an array of empty images in case this is run without
        // valid images in the resources
        var imgArray = [UIImage(color: .blue), UIImage(color: .green)]

        // if these images exist, load them and replace the blank images in imgArray
        if  let img1: UIImage = UIImage(named: "image1"),
            let img2: UIImage = UIImage(named: "image2") {

            imgArray = [img1, img2]

        }

        // create a UIStackView
        let stackView = UIStackView()

        // we can use the default stackView properties
        // but can change axis, alignment, distribution, spacing, etc if desired

        // we will set the auto-layout constraints
        stackView.translatesAutoresizingMaskIntoConstraints = false

        // add the stackView to the scrollView
        scrollView.addSubview(stackView)

        // with auto-layout, scroll views use the content's constraints to
        // determine the contentSize,
        // so pin the stackView to top/bottom/leading/trailing of the scrollView
        stackView.leadingAnchor.constraint(equalTo: scrollView.leadingAnchor, constant: 0.0).isActive = true
        stackView.topAnchor.constraint(equalTo: scrollView.topAnchor, constant: 0.0).isActive = true
        stackView.trailingAnchor.constraint(equalTo: scrollView.trailingAnchor, constant: 0.0).isActive = true
        stackView.bottomAnchor.constraint(equalTo: scrollView.bottomAnchor, constant: 0.0).isActive = true

        // loop through the images
        for img in imgArray {

            // create a new UIImageView
            let imgView = UIImageView(image: img)

            // we will set the auto-layout constraints, and allow the stackView
            // to handle the placement
            imgView.translatesAutoresizingMaskIntoConstraints = false

            // set image scaling as desired
            imgView.contentMode = .scaleToFill

            // add the image view to the stackView
            stackView.addArrangedSubview(imgView)

            // set imgView's width and height to the scrollView's width and height
            imgView.widthAnchor.constraint(equalTo: scrollView.widthAnchor, multiplier: 1.0).isActive = true
            imgView.heightAnchor.constraint(equalTo: scrollView.heightAnchor, multiplier: 1.0).isActive = true

        }

    }

}

let vc = TestViewController()
vc.view.backgroundColor = .red
PlaygroundPage.current.liveView = vc

I think you need to set a proper frame for the cardImgView. 我认为您需要为cardImgView设置适当的框架。 It would be something like 就像

cardImgView.frame = CGRect(x: scrollView.frame.width * CGFloat(i), y: 0, width: scrollView.frame.width, height: scrollView.frame.height)

Finally, after the for loop, you need to set scroll view's content size: 最后,在for循环之后,您需要设置滚动视图的内容大小:

scrollView.contentSize.width = scrollView.frame.width * imgArray.count

Hope this helps. 希望这可以帮助。

I have written scrolling images horizontally in swift. 我写了快速水平滚动图像。 Please check with this: 请检查以下内容:

import UIKit

class ViewController: UIViewController,UIScrollViewDelegate {

    @IBOutlet weak var Bannerview: UIView!
    var spinner = UIActivityIndicatorView(activityIndicatorStyle: .whiteLarge)
    var loadingView: UIView = UIView()
    var loadinglabel: UILabel = UILabel()

    var nextPage :Int!
    var titlelab :UILabel!
    var bannerimg :UIImageView!
    var scroll :UIScrollView!
    var viewPanel :UIView!
    var pgCtr:UIPageControl!
    var bannerArr:[String]!

    var imgUrlstr :NSString!

    var screenSize: CGRect!
    var screenWidth: CGFloat!
    var screenHeight: CGFloat!

    func uicolorFromHex(rgbValue:UInt32)->UIColor
    {
        let red = CGFloat((rgbValue & 0xFF0000) >> 16)/256.0
        let green = CGFloat((rgbValue & 0xFF00) >> 8)/256.0
        let blue = CGFloat(rgbValue & 0xFF)/256.0

        return UIColor(red:red, green:green, blue:blue, alpha:1.0)
    }
    override func viewWillAppear(_ animated: Bool)
    {
        screenSize = UIScreen.main.bounds
        screenWidth = screenSize.width
        screenHeight = screenSize.height

        bannerArr = ["image1.jpeg","image2.jpeg","image3.jpeg","images4.jpeg","images5.jpeg"]

        self.bannerview()

        self.navigationController?.setNavigationBarHidden(false, animated: true)
        self.navigationController?.navigationBar.isTranslucent = false

    }

    override func viewDidLoad() {
        super.viewDidLoad()

        // Do any additional setup after loading the view, typically from a nib.
    }
}

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

相关问题 在 UITableView 中水平滚动 - Swift 3,iOS - Scroll horizontally in UITableView - Swift 3, iOS 如何在UIScrollView iOS / Swift中的控件页面之间水平滚动 - How to horizontally scroll between pages of controls in UIScrollView iOS/Swift UITableView Cell不应该横向滚动swift iOS - UITableView Cell should not scroll horizontally swift iOS 如何使集合视图水平滚动,在 iOS swift 中向左和向右两个方向无限滚动 - how to make a collection view to scroll horizontally having infinite scroll in both directions left, as well as right in iOS swift iOS-如何在Sprite Kit中水平滚动 - iOS - How to scroll horizontally in sprite kit 如何自定义单元格视图并使其以编程方式快速水平滚动 - How to customize the cell views and make them scroll horizontally programmatically in swift 无法使用ScrollView for IOS水平滚动 - Cannot scroll horizontally with ScrollView for IOS 单击iOS中的下一步按钮后如何水平滚动图像 - How to Image scroll in Horizontally after click on next button in iOS 如何在iOS的uiwebview中水平滚动文档(pdf,ppt,docx)? - How to scroll the document(pdf,ppt,docx) horizontally in a uiwebview in ios? swift iOS - 快速滚动后混合的UICollectionView图像 - swift iOS - UICollectionView images mixed up after fast scroll
 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM