add bar, gestures for switching between images
This commit is contained in:
@@ -1,5 +1,10 @@
|
||||
<?xml version="1.0" encoding="UTF-8"?>
|
||||
<!DOCTYPE plist PUBLIC "-//Apple//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd">
|
||||
<plist version="1.0">
|
||||
<dict/>
|
||||
<dict>
|
||||
<key>UIFileSharingEnabled</key>
|
||||
<true/>
|
||||
<key>LSSupportsOpeningDocumentsInPlace</key>
|
||||
<true/>
|
||||
</dict>
|
||||
</plist>
|
||||
|
||||
@@ -1,14 +1,245 @@
|
||||
import UIKit
|
||||
|
||||
class ViewController: UIViewController {
|
||||
enum PageTurn {
|
||||
case next
|
||||
case previous
|
||||
}
|
||||
|
||||
enum PageTurnMode {
|
||||
case leftToRight
|
||||
case rightToLeft
|
||||
case scroll
|
||||
}
|
||||
|
||||
class ViewController: UIViewController, UIGestureRecognizerDelegate {
|
||||
|
||||
var imageView = UIImageView()
|
||||
var images: [UIImage] = []
|
||||
var page = 0
|
||||
var mode = PageTurnMode.leftToRight
|
||||
var leftTap: UITapGestureRecognizer!
|
||||
var rightTap: UITapGestureRecognizer!
|
||||
var topTap: UITapGestureRecognizer!
|
||||
let topBarView = UIView()
|
||||
var isTopBarVisible = false
|
||||
var topBarHeightConstraint: NSLayoutConstraint!
|
||||
|
||||
override func viewDidLoad() {
|
||||
super.viewDidLoad()
|
||||
view.backgroundColor = .white
|
||||
let label = UILabel()
|
||||
label.text = "Hello, UIKit!"
|
||||
label.textAlignment = .center
|
||||
label.frame = CGRect(x: 50, y: 150, width: 300, height: 50)
|
||||
view.addSubview(label)
|
||||
|
||||
view.backgroundColor = .red
|
||||
|
||||
setup()
|
||||
}
|
||||
|
||||
func setup() {
|
||||
setupImageView()
|
||||
setupGestures()
|
||||
setupTopBar()
|
||||
}
|
||||
|
||||
func setupGestures() {
|
||||
let swipeLeft = UISwipeGestureRecognizer(target: self, action: #selector(handleSwipe(_:)))
|
||||
swipeLeft.direction = .left
|
||||
view.addGestureRecognizer(swipeLeft)
|
||||
|
||||
let swipeRight = UISwipeGestureRecognizer(target: self, action: #selector(handleSwipe(_:)))
|
||||
swipeRight.direction = .right
|
||||
view.addGestureRecognizer(swipeRight)
|
||||
|
||||
setupTapZones()
|
||||
}
|
||||
|
||||
func setupTapZones() {
|
||||
let leftView = UIView()
|
||||
let rightView = UIView()
|
||||
let topView = UIView()
|
||||
|
||||
leftView.translatesAutoresizingMaskIntoConstraints = false
|
||||
rightView.translatesAutoresizingMaskIntoConstraints = false
|
||||
topView.translatesAutoresizingMaskIntoConstraints = false
|
||||
|
||||
view.addSubview(leftView)
|
||||
view.addSubview(rightView)
|
||||
view.addSubview(topView)
|
||||
|
||||
NSLayoutConstraint.activate([
|
||||
leftView.leadingAnchor.constraint(equalTo: view.leadingAnchor),
|
||||
leftView.topAnchor.constraint(equalTo: view.topAnchor),
|
||||
leftView.bottomAnchor.constraint(equalTo: view.bottomAnchor),
|
||||
leftView.widthAnchor.constraint(equalTo: view.widthAnchor, multiplier: 0.5),
|
||||
|
||||
rightView.trailingAnchor.constraint(equalTo: view.trailingAnchor),
|
||||
rightView.topAnchor.constraint(equalTo: view.topAnchor),
|
||||
rightView.bottomAnchor.constraint(equalTo: view.bottomAnchor),
|
||||
rightView.widthAnchor.constraint(equalTo: view.widthAnchor, multiplier: 0.5),
|
||||
|
||||
topView.topAnchor.constraint(equalTo: view.topAnchor),
|
||||
topView.leadingAnchor.constraint(equalTo: view.leadingAnchor),
|
||||
topView.trailingAnchor.constraint(equalTo: view.trailingAnchor),
|
||||
topView.heightAnchor.constraint(equalTo: view.heightAnchor, multiplier: 0.2),
|
||||
])
|
||||
|
||||
leftView.backgroundColor = .clear
|
||||
rightView.backgroundColor = .clear
|
||||
topView.backgroundColor = .clear
|
||||
|
||||
leftTap = UITapGestureRecognizer(target: self, action: #selector(handleLeftTap))
|
||||
rightTap = UITapGestureRecognizer(target: self, action: #selector(handleRightTap))
|
||||
topTap = UITapGestureRecognizer(target: self, action: #selector(handleTopTap))
|
||||
|
||||
leftTap.delegate = self
|
||||
rightTap.delegate = self
|
||||
topTap.delegate = self
|
||||
|
||||
leftView.addGestureRecognizer(leftTap)
|
||||
rightView.addGestureRecognizer(rightTap)
|
||||
topView.addGestureRecognizer(topTap)
|
||||
}
|
||||
|
||||
func setupTopBar() {
|
||||
topBarView.translatesAutoresizingMaskIntoConstraints = false
|
||||
topBarView.backgroundColor = UIColor.black.withAlphaComponent(0.8) // Or any style
|
||||
view.addSubview(topBarView)
|
||||
|
||||
topBarHeightConstraint = topBarView.heightAnchor.constraint(equalToConstant: 0)
|
||||
|
||||
NSLayoutConstraint.activate([
|
||||
topBarView.topAnchor.constraint(equalTo: view.safeAreaLayoutGuide.topAnchor),
|
||||
topBarView.leadingAnchor.constraint(equalTo: view.leadingAnchor),
|
||||
topBarView.trailingAnchor.constraint(equalTo: view.trailingAnchor),
|
||||
topBarHeightConstraint,
|
||||
])
|
||||
}
|
||||
|
||||
func gestureRecognizer(
|
||||
_ gestureRecognizer: UIGestureRecognizer,
|
||||
shouldRequireFailureOf otherGestureRecognizer: UIGestureRecognizer
|
||||
) -> Bool {
|
||||
if gestureRecognizer == leftTap || gestureRecognizer == rightTap,
|
||||
otherGestureRecognizer == topTap
|
||||
{
|
||||
return true
|
||||
}
|
||||
return false
|
||||
}
|
||||
|
||||
func toggleTopBar() {
|
||||
isTopBarVisible.toggle()
|
||||
|
||||
topBarHeightConstraint.constant = isTopBarVisible ? 60 : 0 // You can adjust height
|
||||
}
|
||||
|
||||
@objc func handleTopTap() {
|
||||
toggleTopBar()
|
||||
}
|
||||
|
||||
@objc func handleLeftTap() {
|
||||
switch mode {
|
||||
case .rightToLeft: changeImage(turn: .next)
|
||||
case .leftToRight: changeImage(turn: .previous)
|
||||
case .scroll: break
|
||||
}
|
||||
}
|
||||
|
||||
@objc func handleRightTap() {
|
||||
switch mode {
|
||||
case .rightToLeft: changeImage(turn: .previous)
|
||||
case .leftToRight: changeImage(turn: .next)
|
||||
case .scroll: break
|
||||
}
|
||||
}
|
||||
|
||||
@objc func handleSwipe(_ gesture: UISwipeGestureRecognizer) {
|
||||
switch gesture.direction {
|
||||
case .left:
|
||||
switch mode {
|
||||
case .rightToLeft: changeImage(turn: .previous)
|
||||
case .leftToRight: changeImage(turn: .next)
|
||||
case .scroll: break
|
||||
}
|
||||
case .right:
|
||||
switch mode {
|
||||
case .rightToLeft: changeImage(turn: .next)
|
||||
case .leftToRight: changeImage(turn: .previous)
|
||||
case .scroll: break
|
||||
}
|
||||
default: break
|
||||
}
|
||||
}
|
||||
|
||||
func setupImageView() {
|
||||
imageView.translatesAutoresizingMaskIntoConstraints = false
|
||||
|
||||
imageView.contentMode = UIView.ContentMode.scaleAspectFit
|
||||
|
||||
imageView.clipsToBounds = true
|
||||
|
||||
view.addSubview(imageView)
|
||||
|
||||
NSLayoutConstraint.activate([
|
||||
imageView.topAnchor.constraint(equalTo: view.topAnchor),
|
||||
imageView.bottomAnchor.constraint(equalTo: view.bottomAnchor),
|
||||
imageView.leadingAnchor.constraint(equalTo: view.leadingAnchor),
|
||||
imageView.trailingAnchor.constraint(equalTo: view.trailingAnchor),
|
||||
])
|
||||
images = getImages()
|
||||
imageView.image = images[0]
|
||||
}
|
||||
|
||||
func changeImage(turn: PageTurn) {
|
||||
if images.count == 0 {
|
||||
return
|
||||
}
|
||||
switch turn {
|
||||
case .next: page = min(images.count - 1, page + 1)
|
||||
case .previous: page = max(0, page - 1)
|
||||
}
|
||||
imageView.image = images[page]
|
||||
}
|
||||
|
||||
func getImages() -> [UIImage] {
|
||||
let fileManager = FileManager.default
|
||||
let supportedExtensions = ["png", "jpg", "jpeg"]
|
||||
|
||||
guard
|
||||
let documentsURL = fileManager.urls(for: .documentDirectory, in: .userDomainMask).first
|
||||
else {
|
||||
print("Documents directory not found.")
|
||||
return []
|
||||
}
|
||||
|
||||
do {
|
||||
let contents = try fileManager.contentsOfDirectory(
|
||||
at: documentsURL, includingPropertiesForKeys: nil)
|
||||
|
||||
var images: [UIImage] = []
|
||||
|
||||
for file in contents {
|
||||
if supportedExtensions.contains(file.pathExtension.lowercased()) {
|
||||
print("Loading image: \(file.lastPathComponent)")
|
||||
if let image = UIImage(contentsOfFile: file.path) {
|
||||
images.append(image)
|
||||
} else {
|
||||
print("Failed to load image.")
|
||||
}
|
||||
} else {
|
||||
print("No image files found in Documents directory.")
|
||||
}
|
||||
}
|
||||
return images
|
||||
} catch {
|
||||
print("Error reading contents of Documents directory: \(error)")
|
||||
}
|
||||
return []
|
||||
}
|
||||
func createTestFile() {
|
||||
if let documentsURL = FileManager.default.urls(for: .documentDirectory, in: .userDomainMask)
|
||||
.first
|
||||
{
|
||||
let fileURL = documentsURL.appendingPathComponent("dummy.txt")
|
||||
let data = ".".data(using: .utf8)!
|
||||
try? data.write(to: fileURL)
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user