git.iko.soy/dashared/GDproject
on master help sign in
full version of 0.1
commit3084c3b1d8dc81fc28b785bb6eb892d83e8d339e authorDarya Rednikina <rednikina.com@yandex.ru> dateThu 14 Feb 2019, 20:15 (8 years ago) parent27c8e84
8 files changed+118−38
Cartfile+2−1 GDproject.xcodeproj/project.pbxproj+16 GDproject/Controller/FullPostController.swift+49−35 GDproject/Controller/News/PostViewCell.swift+22−1 GDproject/Controller/NewsController.swift+7−1 GDproject/Simple model/Post.swift+1 GDproject/Supporting files/Assets.xcassets/icons8-share-3-500.imageset/Contents.json+21 GDproject/Supporting files/Assets.xcassets/icons8-share-3-500.imageset/icons8-share-3-500.png
Cartfile+2−1
@@ -1,4 +1,5 @@
11github "robb/Cartography"
22github "ivanbruel/MarkdownKit"
33github "roberthein/TinyConstraints"
4−github "macteo/Marklight"
4+github "macteo/Marklight"
5+github "ElaWorkshop/TagListView"
GDproject.xcodeproj/project.pbxproj+16
@@ -28,6 +28,9 @@
2828 12E36DCE22144756006FCDD7 /* Constants.swift in Sources */ = {isa = PBXBuildFile; fileRef = 12E36DCD22144756006FCDD7 /* Constants.swift */; };
2929 12E36DD122148122006FCDD7 /* FullPostController.swift in Sources */ = {isa = PBXBuildFile; fileRef = 12E36DD022148122006FCDD7 /* FullPostController.swift */; };
3030 12E36DD522156559006FCDD7 /* MyStackView.swift in Sources */ = {isa = PBXBuildFile; fileRef = 12E36DD422156559006FCDD7 /* MyStackView.swift */; };
31+ 12E36DD8221594A9006FCDD7 /* TagListView.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 12E36DD622159493006FCDD7 /* TagListView.framework */; };
32+ 12E36DD9221594A9006FCDD7 /* TagListView.framework in Embed Frameworks */ = {isa = PBXBuildFile; fileRef = 12E36DD622159493006FCDD7 /* TagListView.framework */; settings = {ATTRIBUTES = (CodeSignOnCopy, RemoveHeadersOnCopy, ); }; };
33+ 12E36DDB221594B1006FCDD7 /* MarkdownKit.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 12E36DB022143D47006FCDD7 /* MarkdownKit.framework */; };
3134/* End PBXBuildFile section */
3235
3336/* Begin PBXCopyFilesBuildPhase section */
@@ -39,6 +42,7 @@
3942 files = (
4043 12E36DC0221441DB006FCDD7 /* Marklight.framework in Embed Frameworks */,
4144 12E36DC4221441EA006FCDD7 /* Cartography.framework in Embed Frameworks */,
45+ 12E36DD9221594A9006FCDD7 /* TagListView.framework in Embed Frameworks */,
4246 12E36DBD221441D5006FCDD7 /* TinyConstraints.framework in Embed Frameworks */,
4347 12E36DC2221441E1006FCDD7 /* MarkdownKit.framework in Embed Frameworks */,
4448 );
@@ -68,6 +72,7 @@
6872 12E36DCD22144756006FCDD7 /* Constants.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = Constants.swift; sourceTree = "<group>"; };
6973 12E36DD022148122006FCDD7 /* FullPostController.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = FullPostController.swift; sourceTree = "<group>"; };
7074 12E36DD422156559006FCDD7 /* MyStackView.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = MyStackView.swift; sourceTree = "<group>"; };
75+ 12E36DD622159493006FCDD7 /* TagListView.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = TagListView.framework; path = Carthage/Build/iOS/TagListView.framework; sourceTree = "<group>"; };
7176/* End PBXFileReference section */
7277
7378/* Begin PBXFrameworksBuildPhase section */
@@ -76,6 +81,8 @@
7681 buildActionMask = 2147483647;
7782 files = (
7883 12E36DB522143D54006FCDD7 /* TinyConstraints.framework in Frameworks */,
84+ 12E36DDB221594B1006FCDD7 /* MarkdownKit.framework in Frameworks */,
85+ 12E36DD8221594A9006FCDD7 /* TagListView.framework in Frameworks */,
7986 12E36DAF22143D40006FCDD7 /* Cartography.framework in Frameworks */,
8087 12E36DB322143D4E006FCDD7 /* Marklight.framework in Frameworks */,
8188 );
@@ -87,12 +94,14 @@
8794 12E36D8F221424EA006FCDD7 = {
8895 isa = PBXGroup;
8996 children = (
97+ 12E36DD622159493006FCDD7 /* TagListView.framework */,
9098 12E36DB422143D54006FCDD7 /* TinyConstraints.framework */,
9199 12E36DB222143D4E006FCDD7 /* Marklight.framework */,
92100 12E36DB022143D47006FCDD7 /* MarkdownKit.framework */,
93101 12E36DAE22143D40006FCDD7 /* Cartography.framework */,
94102 12E36D9A221424EA006FCDD7 /* GDproject */,
95103 12E36D99221424EA006FCDD7 /* Products */,
104+ 12E36DDA221594B1006FCDD7 /* Frameworks */,
96105 );
97106 sourceTree = "<group>";
98107 };
@@ -158,6 +167,13 @@
158167 path = News;
159168 sourceTree = "<group>";
160169 };
170+ 12E36DDA221594B1006FCDD7 /* Frameworks */ = {
171+ isa = PBXGroup;
172+ children = (
173+ );
174+ name = Frameworks;
175+ sourceTree = "<group>";
176+ };
161177/* End PBXGroup section */
162178
163179/* Begin PBXNativeTarget section */
GDproject/Controller/FullPostController.swift+49−35
@@ -24,14 +24,26 @@ class FullPostController: UITableViewController {
2424
2525 func setUpNavigationBar(){
2626 navigationController?.navigationBar.prefersLargeTitles = false
27− navigationItem.title = "\(String(describing: post?.fromUser.login))"
27+ navigationItem.title = "\(post?.fromUser.login ?? "")"
2828 navigationItem.rightBarButtonItems = [UIBarButtonItem(barButtonSystemItem: .action, target: self, action: #selector(self.options))]
2929 }
3030
3131 @objc func options(){
32− // copy link
33− // share
34− //
32+ // drafts
33+ // saved
34+
35+ let optionMenu = UIAlertController(title: nil, message: nil, preferredStyle: .actionSheet)
36+ let editAction = UIAlertAction(title: "Send via message", style: .default)
37+ let shareAction = UIAlertAction(title: "Send via project", style: .default)
38+ let settingsAction = UIAlertAction(title: "Copy link", style: .default)
39+ let cancelAction = UIAlertAction(title: "Cancel", style: .cancel)
40+
41+ optionMenu.addAction(editAction)
42+ optionMenu.addAction(shareAction)
43+ optionMenu.addAction(settingsAction)
44+ optionMenu.addAction(cancelAction)
45+
46+ self.present(optionMenu, animated: true, completion: nil)
3547 }
3648 // MARK: - Table view data source
3749
@@ -40,42 +52,52 @@ class FullPostController: UITableViewController {
4052 return 2
4153 }
4254
43− override func tableView(_ tableView: UITableView, viewForHeaderInSection section: Int) -> UIView? {
44− let view = UIView(frame: CGRect(x: 0, y: 0, width: UIScreen.main.bounds.width, height: 50))
45− view.backgroundColor = .white
46− switch section {
47− case 0:
48− return view
49− default:
50− return nil
51− }
52− }
5355
54− override func tableView(_ tableView: UITableView, viewForFooterInSection section: Int) -> UIView?
56+ override func tableView(_ tableView: UITableView, viewForHeaderInSection section: Int) -> UIView?
5557 {
56− let view = UIView(frame: CGRect(x: 0, y: 0, width: UIScreen.main.bounds.width, height: 50))
58+ let mainView = UIView(frame: CGRect(x: 0, y: 0, width: UIScreen.main.bounds.width, height: 50))
59+
60+ let scrollView = UIScrollView()
61+
62+ scrollView.backgroundColor = .white
63+
64+ mainView.addSubview(scrollView)
65+ scrollView.edgesToSuperview()
5766
58− let label = UILabel()
59− label.font = UIFont.systemFont(ofSize: 14, weight: .regular)
60− label.text = post?.comments.count == 0 ? "Add first relpy" : "\(post?.comments.count ?? 0) replies"
61− label.textColor = #colorLiteral(red: 0.8039215803, green: 0.8039215803, blue: 0.8039215803, alpha: 1)
67+ scrollView.showsHorizontalScrollIndicator = false
6268
63− let button = UIButton(type: .detailDisclosure)
69+ var buttons: [UIButton] = []
70+ for hash in post!.hashtags {
71+ let button = UIButton()
72+ button.setTitle("#" + hash, for: .normal)
73+ button.backgroundColor = #colorLiteral(red: 0.8039215803, green: 0.8039215803, blue: 0.8039215803, alpha: 1)
74+ button.layer.cornerRadius = 10
75+ button.titleLabel?.font = UIFont.systemFont(ofSize: 14)
76+ button.setTitleColor(.black, for: .normal)
77+ buttons.append(button)
78+ }
79+
80+ let stackView = UIStackView(arrangedSubviews: buttons)
81+
82+ scrollView.addSubview(stackView)
6483
65− view.backgroundColor = .white
66− view.addSubview(button)
67− view.addSubview(label)
84+ stackView.axis = .horizontal
85+ stackView.alignment = .center
86+ stackView.spacing = 20
6887
69− label.edgesToSuperview(excluding: .right, insets: .left(16))
70− button.edgesToSuperview(excluding: .left, insets: .right(16))
88+ stackView.edgesToSuperview(insets: .left(20) + .top(10) + .right(20))
89+
90+ scrollView.contentSize = CGSize(width: 500, height: 50)
7191
7292 switch section {
7393 case 0:
74− return view
94+ return mainView
7595 default:
7696 return nil
7797 }
7898 }
99+
100+
79101 override func tableView(_ tableView: UITableView, heightForHeaderInSection section: Int) -> CGFloat {
80102 switch section {
81103 case 0:
@@ -85,14 +107,6 @@ class FullPostController: UITableViewController {
85107 }
86108 }
87109
88− override func tableView(_ tableView: UITableView, heightForFooterInSection section: Int) -> CGFloat {
89− switch section {
90− case 0:
91− return 50
92− default:
93− return 0
94− }
95− }
96110 override func tableView(_ tableView: UITableView, numberOfRowsInSection section: Int) -> Int
97111 {
98112 switch section {
GDproject/Controller/News/PostViewCell.swift+22−1
@@ -29,6 +29,18 @@ class PostViewCell: UITableViewCell
2929 return label
3030 }()
3131
32+ let commentsLabel: UILabel = {
33+ let label = UILabel()
34+ label.font = UIFont.systemFont(ofSize: 12)
35+ label.textColor = #colorLiteral(red: 0.6000000238, green: 0.6000000238, blue: 0.6000000238, alpha: 1)
36+ return label
37+ }()
38+
39+ let shareButton: UIButton = {
40+ let button = UIButton(type: UIButton.ButtonType.detailDisclosure)
41+ return button
42+ }()
43+
3244 override init(style: UITableViewCell.CellStyle, reuseIdentifier: String?)
3345 {
3446 super.init(style: style, reuseIdentifier: reuseIdentifier)
@@ -95,6 +107,15 @@ class PostViewCell: UITableViewCell
95107 stackView.height(300, relation: .equalOrLess, isActive: true)
96108 }
97109 stackView.topToBottom(of: nameStackView, offset: 16, relation: .equal, isActive: true)
98− stackView.edgesToSuperview(excluding: .top, insets: .left(16) + .right(16))
110+ stackView.edgesToSuperview(excluding: [.top, .bottom], insets: .left(16) + .right(16))
111+
112+ let commentsSharesStackView = UIStackView(arrangedSubviews: [ commentsLabel, shareButton])
113+ contentView.addSubview(commentsSharesStackView)
114+
115+ commentsLabel.text = "14.02.19 в 23:00"
116+ commentsSharesStackView.axis = .horizontal
117+ commentsSharesStackView.distribution = .equalSpacing
118+ commentsSharesStackView.edgesToSuperview(excluding: .top, insets: .bottom(10) + .left(16) + .right(16))
119+ stackView.bottomToTop(of: commentsSharesStackView)
99120 }
100121}
GDproject/Controller/NewsController.swift+7−1
@@ -15,7 +15,9 @@ class NewsController: UIViewController
1515
1616 @IBOutlet weak var tableView: UITableView!
1717
18− var dataSourse: [Post] = [Post(dataArray: [.text("Le Lorem Ipsum est simplement du faux texte employé dans la composition et la mise en page avant impression. Le Lorem Ipsum est le faux texte standard de l'imprimerie depuis les années 1500, quand un imprimeur anonyme assembla ensemble des morceaux de texte pour réaliser un livre spécimen de polices de texte. Il n'a pas fait que survivre cinq siècles, mais s'est aussi adapté à la bureautique informatique, sans que son contenu n'en soit modifié. Il a été popularisé dans les années 1960 grâce à la vente de feuilles Letraset contenant des passages du Lorem Ipsum, et, plus récemment, par son inclusion dans des applications de mise en page de texte, comme Aldus PageMaker. \n On sait depuis longtemps que travailler avec du texte lisible et contenant du sens est source de distractions, et empêche de se concentrer sur la mise en page elle-même. L'avantage du Lorem Ipsum sur un texte générique comme 'Du texte. Du texte. Du texte.' est qu'il possède une distribution de lettres plus ou moins normale, et en tout cas comparable avec celle du français standard. De nombreuses suites logicielles de mise en page ou éditeurs de sites Web ont fait du Lorem Ipsum leur faux texte par défaut, et une recherche pour 'Lorem Ipsum' vous conduira vers de nombreux sites qui n'en sont encore qu'à leur phase de construction. Plusieurs versions sont apparues avec le temps, parfois par accident, souvent intentionnellement (histoire d'y rajouter de petits clins d'oeil, voire des phrases embarassantes).")], from: User(name: "vbogomazova1", id: 2, fullName: "Богомазова Вероника Львовна"), date: "14.02.19 в 12:05")]
18+ var searchController = UISearchController(searchResultsController: nil)
19+
20+ var dataSourse: [Post] = [Post(dataArray: [.text("Le Lorem Ipsum est simplement du faux texte employé dans la composition et la mise en page avant impression. Le Lorem Ipsum est le faux texte standard de l'imprimerie depuis les années 1500, quand un imprimeur anonyme assembla ensemble des morceaux de texte pour réaliser un livre spécimen de polices de texte. Il n'a pas fait que survivre cinq siècles, mais s'est aussi adapté à la bureautique informatique, sans que son contenu n'en soit modifié. Il a été popularisé dans les années 1960 grâce à la vente de feuilles Letraset contenant des passages du Lorem Ipsum, et, plus récemment, par son inclusion dans des applications de mise en page de texte, comme Aldus PageMaker. \n On sait depuis longtemps que travailler avec du texte lisible et contenant du sens est source de distractions, et empêche de se concentrer sur la mise en page elle-même. L'avantage du Lorem Ipsum sur un texte générique comme 'Du texte. Du texte. Du texte.' est qu'il possède une distribution de lettres plus ou moins normale, et en tout cas comparable avec celle du français standard. De nombreuses suites logicielles de mise en page ou éditeurs de sites Web ont fait du Lorem Ipsum leur faux texte par défaut, et une recherche pour 'Lorem Ipsum' vous conduira vers de nombreux sites qui n'en sont encore qu'à leur phase de construction. Plusieurs versions sont apparues avec le temps, parfois par accident, souvent intentionnellement (histoire d'y rajouter de petits clins d'oeil, voire des phrases embarassantes).")], from: User(name: "vbogomazova", id: 2, fullName: "Богомазова Вероника Львовна"), date: "14.02.19 в 12:05")]
1921
2022 override func viewDidLoad()
2123 {
@@ -28,6 +30,10 @@ class NewsController: UIViewController
2830 tableView.reloadData()
2931
3032 setUpNavigationItemsforPosts()
33+ searchController.searchBar.placeholder = "Search anything"
34+
35+ navigationItem.searchController = searchController
36+ definesPresentationContext = true
3137 }
3238
3339 override func viewWillAppear(_ animated: Bool) {
GDproject/Simple model/Post.swift+1
@@ -14,6 +14,7 @@ struct Post {
1414 var fromUser: User
1515 var atDate: String
1616 var comments: [Comment]
17+ var hashtags: [String] = ["ФКН", "Подбельский", "НИУВШЭ", "Шершаков", "ПАД", "Интересное","Мемы","Забавное","Учеба","Наука"]
1718
1819 init(dataArray: [Media], from: User, date: String, comments: [Comment] = [])
1920 {
GDproject/Supporting files/Assets.xcassets/icons8-share-3-500.imageset/Contents.jsonnew file+21
@@ -0,0 +1,21 @@
1+{
2+ "images" : [
3+ {
4+ "idiom" : "universal",
5+ "filename" : "icons8-share-3-500.png",
6+ "scale" : "1x"
7+ },
8+ {
9+ "idiom" : "universal",
10+ "scale" : "2x"
11+ },
12+ {
13+ "idiom" : "universal",
14+ "scale" : "3x"
15+ }
16+ ],
17+ "info" : {
18+ "version" : 1,
19+ "author" : "xcode"
20+ }
21+}
GDproject/Supporting files/Assets.xcassets/icons8-share-3-500.imageset/icons8-share-3-500.pngnew file

Binary file not shown.