diff --git a/ImageFeed.xcodeproj/project.pbxproj b/ImageFeed.xcodeproj/project.pbxproj index c21b349..14f108d 100644 --- a/ImageFeed.xcodeproj/project.pbxproj +++ b/ImageFeed.xcodeproj/project.pbxproj @@ -7,6 +7,7 @@ objects = { /* Begin PBXBuildFile section */ + 5044C5CD2940FC4200E65D8F /* SingleImageViewController.swift in Sources */ = {isa = PBXBuildFile; fileRef = 5044C5CC2940FC4200E65D8F /* SingleImageViewController.swift */; }; 506BFC6E2933D6160058728A /* ImagesListCell.swift in Sources */ = {isa = PBXBuildFile; fileRef = 506BFC6D2933D6160058728A /* ImagesListCell.swift */; }; 50A856762931FDA700E476DF /* AppDelegate.swift in Sources */ = {isa = PBXBuildFile; fileRef = 50A856752931FDA700E476DF /* AppDelegate.swift */; }; 50A856782931FDA700E476DF /* SceneDelegate.swift in Sources */ = {isa = PBXBuildFile; fileRef = 50A856772931FDA700E476DF /* SceneDelegate.swift */; }; @@ -14,9 +15,11 @@ 50A8567D2931FDA700E476DF /* Main.storyboard in Resources */ = {isa = PBXBuildFile; fileRef = 50A8567B2931FDA700E476DF /* Main.storyboard */; }; 50A8567F2931FDA800E476DF /* Assets.xcassets in Resources */ = {isa = PBXBuildFile; fileRef = 50A8567E2931FDA800E476DF /* Assets.xcassets */; }; 50A856822931FDA800E476DF /* LaunchScreen.storyboard in Resources */ = {isa = PBXBuildFile; fileRef = 50A856802931FDA800E476DF /* LaunchScreen.storyboard */; }; + 50EEBC02293B6E2B00E950B5 /* ProfileViewController.swift in Sources */ = {isa = PBXBuildFile; fileRef = 50EEBC01293B6E2B00E950B5 /* ProfileViewController.swift */; }; /* End PBXBuildFile section */ /* Begin PBXFileReference section */ + 5044C5CC2940FC4200E65D8F /* SingleImageViewController.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = SingleImageViewController.swift; sourceTree = ""; }; 506BFC6D2933D6160058728A /* ImagesListCell.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = ImagesListCell.swift; sourceTree = ""; }; 50A856722931FDA700E476DF /* ImageFeed.app */ = {isa = PBXFileReference; explicitFileType = wrapper.application; includeInIndex = 0; path = ImageFeed.app; sourceTree = BUILT_PRODUCTS_DIR; }; 50A856752931FDA700E476DF /* AppDelegate.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = AppDelegate.swift; sourceTree = ""; }; @@ -26,6 +29,7 @@ 50A8567E2931FDA800E476DF /* Assets.xcassets */ = {isa = PBXFileReference; lastKnownFileType = folder.assetcatalog; path = Assets.xcassets; sourceTree = ""; }; 50A856812931FDA800E476DF /* Base */ = {isa = PBXFileReference; lastKnownFileType = file.storyboard; name = Base; path = Base.lproj/LaunchScreen.storyboard; sourceTree = ""; }; 50A856832931FDA800E476DF /* Info.plist */ = {isa = PBXFileReference; lastKnownFileType = text.plist.xml; path = Info.plist; sourceTree = ""; }; + 50EEBC01293B6E2B00E950B5 /* ProfileViewController.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = ProfileViewController.swift; sourceTree = ""; }; /* End PBXFileReference section */ /* Begin PBXFrameworksBuildPhase section */ @@ -39,6 +43,14 @@ /* End PBXFrameworksBuildPhase section */ /* Begin PBXGroup section */ + 5044C5CB2940FC1F00E65D8F /* SingleImage */ = { + isa = PBXGroup; + children = ( + 5044C5CC2940FC4200E65D8F /* SingleImageViewController.swift */, + ); + path = SingleImage; + sourceTree = ""; + }; 506BFC6F2933D62F0058728A /* ImagesList */ = { isa = PBXGroup; children = ( @@ -67,6 +79,8 @@ 50A856742931FDA700E476DF /* ImageFeed */ = { isa = PBXGroup; children = ( + 5044C5CB2940FC1F00E65D8F /* SingleImage */, + 50EEBC00293B6E1100E950B5 /* Profile */, 506BFC6F2933D62F0058728A /* ImagesList */, 50A856752931FDA700E476DF /* AppDelegate.swift */, 50A856772931FDA700E476DF /* SceneDelegate.swift */, @@ -78,6 +92,14 @@ path = ImageFeed; sourceTree = ""; }; + 50EEBC00293B6E1100E950B5 /* Profile */ = { + isa = PBXGroup; + children = ( + 50EEBC01293B6E2B00E950B5 /* ProfileViewController.swift */, + ); + path = Profile; + sourceTree = ""; + }; /* End PBXGroup section */ /* Begin PBXNativeTarget section */ @@ -151,7 +173,9 @@ files = ( 50A8567A2931FDA700E476DF /* ImagesListControllerViewController.swift in Sources */, 506BFC6E2933D6160058728A /* ImagesListCell.swift in Sources */, + 50EEBC02293B6E2B00E950B5 /* ProfileViewController.swift in Sources */, 50A856762931FDA700E476DF /* AppDelegate.swift in Sources */, + 5044C5CD2940FC4200E65D8F /* SingleImageViewController.swift in Sources */, 50A856782931FDA700E476DF /* SceneDelegate.swift in Sources */, ); runOnlyForDeploymentPostprocessing = 0; diff --git a/ImageFeed/Assets.xcassets/Colors/Contents.json b/ImageFeed/Assets.xcassets/Colors/Contents.json new file mode 100644 index 0000000..73c0059 --- /dev/null +++ b/ImageFeed/Assets.xcassets/Colors/Contents.json @@ -0,0 +1,6 @@ +{ + "info" : { + "author" : "xcode", + "version" : 1 + } +} diff --git a/ImageFeed/Assets.xcassets/Colors/YP Black.colorset/Contents.json b/ImageFeed/Assets.xcassets/Colors/YP Black.colorset/Contents.json new file mode 100644 index 0000000..1d65869 --- /dev/null +++ b/ImageFeed/Assets.xcassets/Colors/YP Black.colorset/Contents.json @@ -0,0 +1,38 @@ +{ + "colors" : [ + { + "color" : { + "color-space" : "srgb", + "components" : { + "alpha" : "1.000", + "blue" : "0.133", + "green" : "0.106", + "red" : "0.102" + } + }, + "idiom" : "universal" + }, + { + "appearances" : [ + { + "appearance" : "luminosity", + "value" : "dark" + } + ], + "color" : { + "color-space" : "srgb", + "components" : { + "alpha" : "1.000", + "blue" : "0.133", + "green" : "0.106", + "red" : "0.102" + } + }, + "idiom" : "universal" + } + ], + "info" : { + "author" : "xcode", + "version" : 1 + } +} diff --git a/ImageFeed/Assets.xcassets/Colors/YP Grey.colorset/Contents.json b/ImageFeed/Assets.xcassets/Colors/YP Grey.colorset/Contents.json new file mode 100644 index 0000000..a6ef923 --- /dev/null +++ b/ImageFeed/Assets.xcassets/Colors/YP Grey.colorset/Contents.json @@ -0,0 +1,38 @@ +{ + "colors" : [ + { + "color" : { + "color-space" : "srgb", + "components" : { + "alpha" : "1.000", + "blue" : "0.706", + "green" : "0.686", + "red" : "0.682" + } + }, + "idiom" : "universal" + }, + { + "appearances" : [ + { + "appearance" : "luminosity", + "value" : "dark" + } + ], + "color" : { + "color-space" : "srgb", + "components" : { + "alpha" : "1.000", + "blue" : "0.706", + "green" : "0.686", + "red" : "0.682" + } + }, + "idiom" : "universal" + } + ], + "info" : { + "author" : "xcode", + "version" : 1 + } +} diff --git a/ImageFeed/Assets.xcassets/YP Black.colorset/Contents.json b/ImageFeed/Assets.xcassets/Colors/YP Red.colorset/Contents.json similarity index 76% rename from ImageFeed/Assets.xcassets/YP Black.colorset/Contents.json rename to ImageFeed/Assets.xcassets/Colors/YP Red.colorset/Contents.json index b15ea4c..11976ca 100644 --- a/ImageFeed/Assets.xcassets/YP Black.colorset/Contents.json +++ b/ImageFeed/Assets.xcassets/Colors/YP Red.colorset/Contents.json @@ -5,9 +5,9 @@ "color-space" : "srgb", "components" : { "alpha" : "1.000", - "blue" : "0x22", - "green" : "0x1B", - "red" : "0x1A" + "blue" : "0x6C", + "green" : "0x6B", + "red" : "0xF5" } }, "idiom" : "universal" @@ -23,9 +23,9 @@ "color-space" : "srgb", "components" : { "alpha" : "1.000", - "blue" : "0x22", - "green" : "0x1B", - "red" : "0x1A" + "blue" : "0x6C", + "green" : "0x6B", + "red" : "0xF5" } }, "idiom" : "universal" diff --git a/ImageFeed/Assets.xcassets/Colors/YP White.colorset/Contents.json b/ImageFeed/Assets.xcassets/Colors/YP White.colorset/Contents.json new file mode 100644 index 0000000..22c4bb0 --- /dev/null +++ b/ImageFeed/Assets.xcassets/Colors/YP White.colorset/Contents.json @@ -0,0 +1,38 @@ +{ + "colors" : [ + { + "color" : { + "color-space" : "srgb", + "components" : { + "alpha" : "1.000", + "blue" : "1.000", + "green" : "1.000", + "red" : "1.000" + } + }, + "idiom" : "universal" + }, + { + "appearances" : [ + { + "appearance" : "luminosity", + "value" : "dark" + } + ], + "color" : { + "color-space" : "srgb", + "components" : { + "alpha" : "1.000", + "blue" : "1.000", + "green" : "1.000", + "red" : "1.000" + } + }, + "idiom" : "universal" + } + ], + "info" : { + "author" : "xcode", + "version" : 1 + } +} diff --git a/ImageFeed/Assets.xcassets/AccentColor.colorset/Contents.json b/ImageFeed/Assets.xcassets/Icons/AccentColor.colorset/Contents.json similarity index 100% rename from ImageFeed/Assets.xcassets/AccentColor.colorset/Contents.json rename to ImageFeed/Assets.xcassets/Icons/AccentColor.colorset/Contents.json diff --git a/ImageFeed/Assets.xcassets/AppIcon.appiconset/Contents.json b/ImageFeed/Assets.xcassets/Icons/AppIcon.appiconset/Contents.json similarity index 100% rename from ImageFeed/Assets.xcassets/AppIcon.appiconset/Contents.json rename to ImageFeed/Assets.xcassets/Icons/AppIcon.appiconset/Contents.json diff --git a/ImageFeed/Assets.xcassets/Icons/Backward.imageset/Backward.png b/ImageFeed/Assets.xcassets/Icons/Backward.imageset/Backward.png new file mode 100644 index 0000000..1e28c7e Binary files /dev/null and b/ImageFeed/Assets.xcassets/Icons/Backward.imageset/Backward.png differ diff --git a/ImageFeed/Assets.xcassets/Icons/Backward.imageset/Contents.json b/ImageFeed/Assets.xcassets/Icons/Backward.imageset/Contents.json new file mode 100644 index 0000000..a410a9b --- /dev/null +++ b/ImageFeed/Assets.xcassets/Icons/Backward.imageset/Contents.json @@ -0,0 +1,21 @@ +{ + "images" : [ + { + "filename" : "Backward.png", + "idiom" : "universal", + "scale" : "1x" + }, + { + "idiom" : "universal", + "scale" : "2x" + }, + { + "idiom" : "universal", + "scale" : "3x" + } + ], + "info" : { + "author" : "xcode", + "version" : 1 + } +} diff --git a/ImageFeed/Assets.xcassets/Icons/Contents.json b/ImageFeed/Assets.xcassets/Icons/Contents.json new file mode 100644 index 0000000..73c0059 --- /dev/null +++ b/ImageFeed/Assets.xcassets/Icons/Contents.json @@ -0,0 +1,6 @@ +{ + "info" : { + "author" : "xcode", + "version" : 1 + } +} diff --git a/ImageFeed/Assets.xcassets/Icons/Exit.imageset/Contents.json b/ImageFeed/Assets.xcassets/Icons/Exit.imageset/Contents.json new file mode 100644 index 0000000..be12e6d --- /dev/null +++ b/ImageFeed/Assets.xcassets/Icons/Exit.imageset/Contents.json @@ -0,0 +1,21 @@ +{ + "images" : [ + { + "filename" : "Exit.png", + "idiom" : "universal", + "scale" : "1x" + }, + { + "idiom" : "universal", + "scale" : "2x" + }, + { + "idiom" : "universal", + "scale" : "3x" + } + ], + "info" : { + "author" : "xcode", + "version" : 1 + } +} diff --git a/ImageFeed/Assets.xcassets/Icons/Exit.imageset/Exit.png b/ImageFeed/Assets.xcassets/Icons/Exit.imageset/Exit.png new file mode 100644 index 0000000..b461674 Binary files /dev/null and b/ImageFeed/Assets.xcassets/Icons/Exit.imageset/Exit.png differ diff --git a/ImageFeed/Assets.xcassets/Logo.imageset/Contents.json b/ImageFeed/Assets.xcassets/Icons/Logo.imageset/Contents.json similarity index 100% rename from ImageFeed/Assets.xcassets/Logo.imageset/Contents.json rename to ImageFeed/Assets.xcassets/Icons/Logo.imageset/Contents.json diff --git a/ImageFeed/Assets.xcassets/Logo.imageset/Vector.png b/ImageFeed/Assets.xcassets/Icons/Logo.imageset/Vector.png similarity index 100% rename from ImageFeed/Assets.xcassets/Logo.imageset/Vector.png rename to ImageFeed/Assets.xcassets/Icons/Logo.imageset/Vector.png diff --git a/ImageFeed/Assets.xcassets/Icons/Photo.imageset/Contents.json b/ImageFeed/Assets.xcassets/Icons/Photo.imageset/Contents.json new file mode 100644 index 0000000..b8b03a0 --- /dev/null +++ b/ImageFeed/Assets.xcassets/Icons/Photo.imageset/Contents.json @@ -0,0 +1,21 @@ +{ + "images" : [ + { + "filename" : "Photo.pdf", + "idiom" : "universal", + "scale" : "1x" + }, + { + "idiom" : "universal", + "scale" : "2x" + }, + { + "idiom" : "universal", + "scale" : "3x" + } + ], + "info" : { + "author" : "xcode", + "version" : 1 + } +} diff --git a/ImageFeed/Assets.xcassets/Icons/Photo.imageset/Photo.pdf b/ImageFeed/Assets.xcassets/Icons/Photo.imageset/Photo.pdf new file mode 100644 index 0000000..7e7e79e Binary files /dev/null and b/ImageFeed/Assets.xcassets/Icons/Photo.imageset/Photo.pdf differ diff --git a/ImageFeed/Assets.xcassets/Icons/Sharing.imageset/Contents.json b/ImageFeed/Assets.xcassets/Icons/Sharing.imageset/Contents.json new file mode 100644 index 0000000..3bfb24e --- /dev/null +++ b/ImageFeed/Assets.xcassets/Icons/Sharing.imageset/Contents.json @@ -0,0 +1,21 @@ +{ + "images" : [ + { + "filename" : "Sharing.pdf", + "idiom" : "universal", + "scale" : "1x" + }, + { + "idiom" : "universal", + "scale" : "2x" + }, + { + "idiom" : "universal", + "scale" : "3x" + } + ], + "info" : { + "author" : "xcode", + "version" : 1 + } +} diff --git a/ImageFeed/Assets.xcassets/Icons/Sharing.imageset/Sharing.pdf b/ImageFeed/Assets.xcassets/Icons/Sharing.imageset/Sharing.pdf new file mode 100644 index 0000000..eee12c4 Binary files /dev/null and b/ImageFeed/Assets.xcassets/Icons/Sharing.imageset/Sharing.pdf differ diff --git a/ImageFeed/Assets.xcassets/Active.imageset/Active.png b/ImageFeed/Assets.xcassets/Icons/liked.imageset/Active.png similarity index 100% rename from ImageFeed/Assets.xcassets/Active.imageset/Active.png rename to ImageFeed/Assets.xcassets/Icons/liked.imageset/Active.png diff --git a/ImageFeed/Assets.xcassets/Active.imageset/Contents.json b/ImageFeed/Assets.xcassets/Icons/liked.imageset/Contents.json similarity index 100% rename from ImageFeed/Assets.xcassets/Active.imageset/Contents.json rename to ImageFeed/Assets.xcassets/Icons/liked.imageset/Contents.json diff --git a/ImageFeed/Assets.xcassets/No Active.imageset/Contents.json b/ImageFeed/Assets.xcassets/Icons/no liked.imageset/Contents.json similarity index 100% rename from ImageFeed/Assets.xcassets/No Active.imageset/Contents.json rename to ImageFeed/Assets.xcassets/Icons/no liked.imageset/Contents.json diff --git a/ImageFeed/Assets.xcassets/No Active.imageset/No Active.png b/ImageFeed/Assets.xcassets/Icons/no liked.imageset/No Active.png similarity index 100% rename from ImageFeed/Assets.xcassets/No Active.imageset/No Active.png rename to ImageFeed/Assets.xcassets/Icons/no liked.imageset/No Active.png diff --git a/ImageFeed/Assets.xcassets/Icons/tab_editorial_active.imageset/Active.png b/ImageFeed/Assets.xcassets/Icons/tab_editorial_active.imageset/Active.png new file mode 100644 index 0000000..d522e6f Binary files /dev/null and b/ImageFeed/Assets.xcassets/Icons/tab_editorial_active.imageset/Active.png differ diff --git a/ImageFeed/Assets.xcassets/Icons/tab_editorial_active.imageset/Contents.json b/ImageFeed/Assets.xcassets/Icons/tab_editorial_active.imageset/Contents.json new file mode 100644 index 0000000..0fe7a56 --- /dev/null +++ b/ImageFeed/Assets.xcassets/Icons/tab_editorial_active.imageset/Contents.json @@ -0,0 +1,21 @@ +{ + "images" : [ + { + "filename" : "Active.png", + "idiom" : "universal", + "scale" : "1x" + }, + { + "idiom" : "universal", + "scale" : "2x" + }, + { + "idiom" : "universal", + "scale" : "3x" + } + ], + "info" : { + "author" : "xcode", + "version" : 1 + } +} diff --git a/ImageFeed/Assets.xcassets/Icons/tab_profile_active.imageset/Contents.json b/ImageFeed/Assets.xcassets/Icons/tab_profile_active.imageset/Contents.json new file mode 100644 index 0000000..effb505 --- /dev/null +++ b/ImageFeed/Assets.xcassets/Icons/tab_profile_active.imageset/Contents.json @@ -0,0 +1,21 @@ +{ + "images" : [ + { + "filename" : "tab_profile_active.png", + "idiom" : "universal", + "scale" : "1x" + }, + { + "idiom" : "universal", + "scale" : "2x" + }, + { + "idiom" : "universal", + "scale" : "3x" + } + ], + "info" : { + "author" : "xcode", + "version" : 1 + } +} diff --git a/ImageFeed/Assets.xcassets/Icons/tab_profile_active.imageset/tab_profile_active.png b/ImageFeed/Assets.xcassets/Icons/tab_profile_active.imageset/tab_profile_active.png new file mode 100644 index 0000000..cc36a93 Binary files /dev/null and b/ImageFeed/Assets.xcassets/Icons/tab_profile_active.imageset/tab_profile_active.png differ diff --git a/ImageFeed/Base.lproj/Main.storyboard b/ImageFeed/Base.lproj/Main.storyboard index 849958b..be59c45 100644 --- a/ImageFeed/Base.lproj/Main.storyboard +++ b/ImageFeed/Base.lproj/Main.storyboard @@ -1,5 +1,5 @@ - + @@ -18,7 +18,7 @@ - + @@ -88,20 +88,138 @@ + + + - + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + - + + + + diff --git a/ImageFeed/ImagesList/ImagesListControllerViewController.swift b/ImageFeed/ImagesList/ImagesListControllerViewController.swift index 85c6ebb..1c513e4 100644 --- a/ImageFeed/ImagesList/ImagesListControllerViewController.swift +++ b/ImageFeed/ImagesList/ImagesListControllerViewController.swift @@ -12,6 +12,7 @@ class ImagesListViewController: UIViewController { @IBOutlet private var tableViewImage: UITableView! private var photosName = [String]() + private let showSingleImageSegueIdentifier = "ShowSingleImage" private lazy var dateFormatter: DateFormatter = { let formatter = DateFormatter() @@ -25,11 +26,25 @@ class ImagesListViewController: UIViewController { photosName = Array(0..<20).map{"\($0)"} } + + override func prepare(for segue: UIStoryboardSegue, sender: Any?) { + if segue.identifier == showSingleImageSegueIdentifier { + if let viewController = segue.destination as? SingleImageViewController { + if let indexPath = sender as? IndexPath { + let image = UIImage(named: photosName[indexPath.row]) + viewController.image = image + } + } + + } else { + super.prepare(for: segue, sender: sender) + } + } } extension ImagesListViewController: UITableViewDelegate { func tableView(_ tableView: UITableView, didSelectRowAt indexPath: IndexPath) { - + performSegue(withIdentifier: showSingleImageSegueIdentifier, sender: indexPath) } } @@ -60,10 +75,11 @@ extension ImagesListViewController: UITableViewDataSource { cell.date.text = dateFormatter.string(from: Date()) if indexPath.row % 2 == 0 { - cell.favoriteButton.setImage(UIImage(named: "Active"), for: .normal) + cell.favoriteButton.setImage(UIImage(named: "liked"), for: .normal) } else{ - cell.favoriteButton.setImage(UIImage(named: "No Active"), for: .normal) + cell.favoriteButton.setImage(UIImage(named: "no liked"), for: .normal) } } } + diff --git a/ImageFeed/Profile/ProfileViewController.swift b/ImageFeed/Profile/ProfileViewController.swift new file mode 100644 index 0000000..afa0af7 --- /dev/null +++ b/ImageFeed/Profile/ProfileViewController.swift @@ -0,0 +1,78 @@ +// +// ProfileViewController.swift +// ImageFeed +// +// Created by Albert on 03.12.2022. +// + +import UIKit + +class ProfileViewController: UIViewController { + + private let image = UIImageView() + private let labelName = UILabel() + private let labelNickname = UILabel() + private let labelStatus = UILabel() + private let button = UIButton.systemButton(with: UIImage(systemName: "ipad.and.arrow.forward")!, target: ProfileViewController.self, action: nil) + + override func viewDidLoad() { + super.viewDidLoad() + + addSubviews() + setViewConfiguration() + activateConstraints() + } + + private func addSubviews() { + view.addSubview(image) + view.addSubview(labelName) + view.addSubview(labelNickname) + view.addSubview(labelStatus) + view.addSubview(button) + + image.translatesAutoresizingMaskIntoConstraints = false + labelName.translatesAutoresizingMaskIntoConstraints = false + labelNickname.translatesAutoresizingMaskIntoConstraints = false + labelStatus.translatesAutoresizingMaskIntoConstraints = false + button.translatesAutoresizingMaskIntoConstraints = false + } + + private func setViewConfiguration() { + image.image = UIImage(named: "Photo") + + labelName.text = "Екатерина Новикова" + labelName.textColor = UIColor(named: "YP White") + labelName.font = labelName.font.withSize(23) + + labelNickname.text = "@ekaterina_nov" + labelNickname.textColor = UIColor(named: "YP Grey") + labelNickname.font = labelNickname.font.withSize(13) + + labelStatus.text = "Hello, world" + labelStatus.textColor = UIColor(named: "YP White") + labelStatus.font = labelStatus.font.withSize(13) + + button.tintColor = UIColor(named: "YP Red") + } + + private func activateConstraints() { + NSLayoutConstraint.activate([ + image.heightAnchor.constraint(equalToConstant: 70), + image.widthAnchor.constraint(equalToConstant: 70), + image.topAnchor.constraint(equalTo: view.safeAreaLayoutGuide.topAnchor, constant: 20), + image.leadingAnchor.constraint(equalTo: view.safeAreaLayoutGuide.leadingAnchor, constant: 16), + labelName.topAnchor.constraint(equalTo: image.bottomAnchor, constant: 8), + labelName.leadingAnchor.constraint(equalTo: image.leadingAnchor), + labelNickname.topAnchor.constraint(equalTo: labelName.bottomAnchor, constant: 8), + labelNickname.leadingAnchor.constraint(equalTo: labelName.leadingAnchor), + labelStatus.topAnchor.constraint(equalTo: labelNickname.bottomAnchor, constant: 8), + labelStatus.leadingAnchor.constraint(equalTo: labelName.leadingAnchor), + button.centerYAnchor.constraint(equalTo: image.centerYAnchor), + button.trailingAnchor.constraint(equalTo: view.safeAreaLayoutGuide.trailingAnchor, constant: -20) + ]) + } + +// @IBAction func clickExitButton(_ sender: Any) { +// +// } +} diff --git a/ImageFeed/SingleImage/SingleImageViewController.swift b/ImageFeed/SingleImage/SingleImageViewController.swift new file mode 100644 index 0000000..c4561b9 --- /dev/null +++ b/ImageFeed/SingleImage/SingleImageViewController.swift @@ -0,0 +1,71 @@ +// +// SingleImageViewController.swift +// ImageFeed +// +// Created by Albert on 07.12.2022. +// + +import UIKit + +class SingleImageViewController: UIViewController { + + + @IBOutlet weak private var buttonBack: UIButton! + @IBOutlet weak private var imageView: UIImageView! + @IBOutlet weak private var scrollView: UIScrollView! + + @IBOutlet weak var sharingButton: UIButton! + + var image: UIImage! { + didSet { + guard isViewLoaded else { return } // 1 + imageView.image = image // 2 + rescaleAndCenterImageInScrollView(image: image) + } + } + + override func viewDidLoad() { + super.viewDidLoad() + buttonBack.setTitle("", for: .normal) + sharingButton.setTitle("", for: .normal) + imageView.image = image + rescaleAndCenterImageInScrollView(image: image) + scrollView.minimumZoomScale = 0.1 + scrollView.maximumZoomScale = 1.25 + } + + @IBAction private func clickBackButton(_ sender: Any) { + self.dismiss(animated: true) + } + + private func rescaleAndCenterImageInScrollView(image: UIImage) { + let minZoomScale = scrollView.minimumZoomScale + let maxZoomScale = scrollView.maximumZoomScale + view.layoutIfNeeded() + let visibleRectSize = scrollView.bounds.size + let imageSize = image.size + let hScale = visibleRectSize.width / imageSize.width + let vScale = visibleRectSize.height / imageSize.height + let scale = min(maxZoomScale, max(minZoomScale, max(hScale, vScale))) + scrollView.setZoomScale(scale, animated: false) + scrollView.layoutIfNeeded() + let newContentSize = scrollView.contentSize + let x = (newContentSize.width - visibleRectSize.width) / 2 + let y = (newContentSize.height - visibleRectSize.height) / 2 + scrollView.setContentOffset(CGPoint(x: x, y: y), animated: false) + } + + @IBAction private func clickSharingButton(_ sender: Any) { + let share = UIActivityViewController( + activityItems: [image], + applicationActivities: nil + ) + present(share, animated: true, completion: nil) + } +} + +extension SingleImageViewController: UIScrollViewDelegate { + func viewForZooming(in scrollView: UIScrollView) -> UIView? { + imageView + } +}