Make list of servers look nice (#540)
This commit is contained in:
parent
e987affcc9
commit
f9f14cff3c
|
@ -91,6 +91,7 @@
|
||||||
D87BFC8B291D5C6B00FEE264 /* MastodonLoginView.swift in Sources */ = {isa = PBXBuildFile; fileRef = D87BFC8A291D5C6B00FEE264 /* MastodonLoginView.swift */; };
|
D87BFC8B291D5C6B00FEE264 /* MastodonLoginView.swift in Sources */ = {isa = PBXBuildFile; fileRef = D87BFC8A291D5C6B00FEE264 /* MastodonLoginView.swift */; };
|
||||||
D87BFC8D291EB81200FEE264 /* MastodonLoginViewModel.swift in Sources */ = {isa = PBXBuildFile; fileRef = D87BFC8C291EB81200FEE264 /* MastodonLoginViewModel.swift */; };
|
D87BFC8D291EB81200FEE264 /* MastodonLoginViewModel.swift in Sources */ = {isa = PBXBuildFile; fileRef = D87BFC8C291EB81200FEE264 /* MastodonLoginViewModel.swift */; };
|
||||||
D87BFC8F291EC26A00FEE264 /* MastodonLoginServerTableViewCell.swift in Sources */ = {isa = PBXBuildFile; fileRef = D87BFC8E291EC26A00FEE264 /* MastodonLoginServerTableViewCell.swift */; };
|
D87BFC8F291EC26A00FEE264 /* MastodonLoginServerTableViewCell.swift in Sources */ = {isa = PBXBuildFile; fileRef = D87BFC8E291EC26A00FEE264 /* MastodonLoginServerTableViewCell.swift */; };
|
||||||
|
D8916DC029211BE500124085 /* ContentSizedTableView.swift in Sources */ = {isa = PBXBuildFile; fileRef = D8916DBF29211BE500124085 /* ContentSizedTableView.swift */; };
|
||||||
D8A6AB6C291C5136003AB663 /* MastodonLoginViewController.swift in Sources */ = {isa = PBXBuildFile; fileRef = D8A6AB6B291C5136003AB663 /* MastodonLoginViewController.swift */; };
|
D8A6AB6C291C5136003AB663 /* MastodonLoginViewController.swift in Sources */ = {isa = PBXBuildFile; fileRef = D8A6AB6B291C5136003AB663 /* MastodonLoginViewController.swift */; };
|
||||||
DB0009A626AEE5DC009B9D2D /* Intents.intentdefinition in Sources */ = {isa = PBXBuildFile; fileRef = DB0009A926AEE5DC009B9D2D /* Intents.intentdefinition */; settings = {ATTRIBUTES = (codegen, ); }; };
|
DB0009A626AEE5DC009B9D2D /* Intents.intentdefinition in Sources */ = {isa = PBXBuildFile; fileRef = DB0009A926AEE5DC009B9D2D /* Intents.intentdefinition */; settings = {ATTRIBUTES = (codegen, ); }; };
|
||||||
DB0009A726AEE5DC009B9D2D /* Intents.intentdefinition in Sources */ = {isa = PBXBuildFile; fileRef = DB0009A926AEE5DC009B9D2D /* Intents.intentdefinition */; };
|
DB0009A726AEE5DC009B9D2D /* Intents.intentdefinition in Sources */ = {isa = PBXBuildFile; fileRef = DB0009A926AEE5DC009B9D2D /* Intents.intentdefinition */; };
|
||||||
|
@ -615,6 +616,7 @@
|
||||||
D87BFC8A291D5C6B00FEE264 /* MastodonLoginView.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = MastodonLoginView.swift; sourceTree = "<group>"; };
|
D87BFC8A291D5C6B00FEE264 /* MastodonLoginView.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = MastodonLoginView.swift; sourceTree = "<group>"; };
|
||||||
D87BFC8C291EB81200FEE264 /* MastodonLoginViewModel.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = MastodonLoginViewModel.swift; sourceTree = "<group>"; };
|
D87BFC8C291EB81200FEE264 /* MastodonLoginViewModel.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = MastodonLoginViewModel.swift; sourceTree = "<group>"; };
|
||||||
D87BFC8E291EC26A00FEE264 /* MastodonLoginServerTableViewCell.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = MastodonLoginServerTableViewCell.swift; sourceTree = "<group>"; };
|
D87BFC8E291EC26A00FEE264 /* MastodonLoginServerTableViewCell.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = MastodonLoginServerTableViewCell.swift; sourceTree = "<group>"; };
|
||||||
|
D8916DBF29211BE500124085 /* ContentSizedTableView.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = ContentSizedTableView.swift; sourceTree = "<group>"; };
|
||||||
D8A6AB6B291C5136003AB663 /* MastodonLoginViewController.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = MastodonLoginViewController.swift; sourceTree = "<group>"; };
|
D8A6AB6B291C5136003AB663 /* MastodonLoginViewController.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = MastodonLoginViewController.swift; sourceTree = "<group>"; };
|
||||||
DB0009A826AEE5DC009B9D2D /* Base */ = {isa = PBXFileReference; lastKnownFileType = file.intentdefinition; name = Base; path = Base.lproj/Intents.intentdefinition; sourceTree = "<group>"; };
|
DB0009A826AEE5DC009B9D2D /* Base */ = {isa = PBXFileReference; lastKnownFileType = file.intentdefinition; name = Base; path = Base.lproj/Intents.intentdefinition; sourceTree = "<group>"; };
|
||||||
DB0009AD26AEE5E4009B9D2D /* ar */ = {isa = PBXFileReference; lastKnownFileType = text.plist.strings; name = ar; path = ar.lproj/Intents.strings; sourceTree = "<group>"; };
|
DB0009AD26AEE5E4009B9D2D /* ar */ = {isa = PBXFileReference; lastKnownFileType = text.plist.strings; name = ar; path = ar.lproj/Intents.strings; sourceTree = "<group>"; };
|
||||||
|
@ -1509,6 +1511,7 @@
|
||||||
D87BFC8A291D5C6B00FEE264 /* MastodonLoginView.swift */,
|
D87BFC8A291D5C6B00FEE264 /* MastodonLoginView.swift */,
|
||||||
D87BFC8C291EB81200FEE264 /* MastodonLoginViewModel.swift */,
|
D87BFC8C291EB81200FEE264 /* MastodonLoginViewModel.swift */,
|
||||||
D87BFC8E291EC26A00FEE264 /* MastodonLoginServerTableViewCell.swift */,
|
D87BFC8E291EC26A00FEE264 /* MastodonLoginServerTableViewCell.swift */,
|
||||||
|
D8916DBF29211BE500124085 /* ContentSizedTableView.swift */,
|
||||||
);
|
);
|
||||||
path = Login;
|
path = Login;
|
||||||
sourceTree = "<group>";
|
sourceTree = "<group>";
|
||||||
|
@ -3311,6 +3314,7 @@
|
||||||
DB63F769279A5EBB00455B82 /* NotificationTimelineViewModel+Diffable.swift in Sources */,
|
DB63F769279A5EBB00455B82 /* NotificationTimelineViewModel+Diffable.swift in Sources */,
|
||||||
DBFEEC9B279BDDD9004F81DD /* ProfileAboutViewModel+Diffable.swift in Sources */,
|
DBFEEC9B279BDDD9004F81DD /* ProfileAboutViewModel+Diffable.swift in Sources */,
|
||||||
DBB525562611EDCA002F1F29 /* UserTimelineViewModel.swift in Sources */,
|
DBB525562611EDCA002F1F29 /* UserTimelineViewModel.swift in Sources */,
|
||||||
|
D8916DC029211BE500124085 /* ContentSizedTableView.swift in Sources */,
|
||||||
DB0618012785732C0030EE79 /* ServerRulesTableViewCell.swift in Sources */,
|
DB0618012785732C0030EE79 /* ServerRulesTableViewCell.swift in Sources */,
|
||||||
DB98EB5C27B10A730082E365 /* ReportSupplementaryViewModel.swift in Sources */,
|
DB98EB5C27B10A730082E365 /* ReportSupplementaryViewModel.swift in Sources */,
|
||||||
DB0617EF277F12720030EE79 /* NavigationActionView.swift in Sources */,
|
DB0617EF277F12720030EE79 /* NavigationActionView.swift in Sources */,
|
||||||
|
|
|
@ -0,0 +1,22 @@
|
||||||
|
//
|
||||||
|
// MastodonLoginTableView.swift
|
||||||
|
// Mastodon
|
||||||
|
//
|
||||||
|
// Created by Nathan Mattes on 13.11.22.
|
||||||
|
//
|
||||||
|
|
||||||
|
import UIKit
|
||||||
|
|
||||||
|
// Source: https://stackoverflow.com/a/48623673
|
||||||
|
final class ContentSizedTableView: UITableView {
|
||||||
|
override var contentSize:CGSize {
|
||||||
|
didSet {
|
||||||
|
invalidateIntrinsicContentSize()
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
override var intrinsicContentSize: CGSize {
|
||||||
|
layoutIfNeeded()
|
||||||
|
return CGSize(width: UIView.noIntrinsicMetric, height: contentSize.height)
|
||||||
|
}
|
||||||
|
}
|
|
@ -10,7 +10,6 @@ import MastodonAsset
|
||||||
|
|
||||||
class MastodonLoginView: UIView {
|
class MastodonLoginView: UIView {
|
||||||
|
|
||||||
// SearchBox, queries api.joinmastodon.org/servers with domain
|
|
||||||
// List with (filtered) domains
|
// List with (filtered) domains
|
||||||
|
|
||||||
let titleLabel: UILabel
|
let titleLabel: UILabel
|
||||||
|
@ -46,14 +45,17 @@ class MastodonLoginView: UIView {
|
||||||
searchTextField.placeholder = "Search for your server" //TODO: @zeitschlag Localization
|
searchTextField.placeholder = "Search for your server" //TODO: @zeitschlag Localization
|
||||||
searchTextField.leftView = UIImageView(image: UIImage(systemName: "magnifyingglass"))
|
searchTextField.leftView = UIImageView(image: UIImage(systemName: "magnifyingglass"))
|
||||||
searchTextField.leftViewMode = .always
|
searchTextField.leftViewMode = .always
|
||||||
|
searchTextField.layer.cornerRadius = 10
|
||||||
|
|
||||||
tableView = UITableView()
|
tableView = ContentSizedTableView()
|
||||||
tableView.translatesAutoresizingMaskIntoConstraints = false
|
tableView.translatesAutoresizingMaskIntoConstraints = false
|
||||||
tableView.backgroundColor = Asset.Scene.Onboarding.background.color
|
tableView.backgroundColor = Asset.Scene.Onboarding.textFieldBackground.color
|
||||||
|
|
||||||
tableViewWrapper = UIView()
|
tableViewWrapper = UIView()
|
||||||
tableViewWrapper.translatesAutoresizingMaskIntoConstraints = false
|
tableViewWrapper.translatesAutoresizingMaskIntoConstraints = false
|
||||||
tableViewWrapper.backgroundColor = .clear
|
tableViewWrapper.backgroundColor = .clear
|
||||||
|
tableViewWrapper.layer.cornerRadius = 10
|
||||||
|
tableViewWrapper.layer.masksToBounds = true
|
||||||
tableViewWrapper.addSubview(tableView)
|
tableViewWrapper.addSubview(tableView)
|
||||||
|
|
||||||
navigationActionView = NavigationActionView()
|
navigationActionView = NavigationActionView()
|
||||||
|
@ -89,12 +91,12 @@ class MastodonLoginView: UIView {
|
||||||
tableViewWrapper.topAnchor.constraint(equalTo: searchTextField.bottomAnchor),
|
tableViewWrapper.topAnchor.constraint(equalTo: searchTextField.bottomAnchor),
|
||||||
tableViewWrapper.leadingAnchor.constraint(equalTo: leadingAnchor, constant: 16),
|
tableViewWrapper.leadingAnchor.constraint(equalTo: leadingAnchor, constant: 16),
|
||||||
trailingAnchor.constraint(equalTo: tableViewWrapper.trailingAnchor, constant: 16),
|
trailingAnchor.constraint(equalTo: tableViewWrapper.trailingAnchor, constant: 16),
|
||||||
tableViewWrapper.bottomAnchor.constraint(equalTo: navigationActionView.topAnchor),
|
tableViewWrapper.bottomAnchor.constraint(lessThanOrEqualTo: navigationActionView.topAnchor),
|
||||||
|
|
||||||
tableView.topAnchor.constraint(equalTo: tableViewWrapper.topAnchor),
|
tableView.topAnchor.constraint(equalTo: tableViewWrapper.topAnchor),
|
||||||
tableView.leadingAnchor.constraint(equalTo: tableViewWrapper.leadingAnchor),
|
tableView.leadingAnchor.constraint(equalTo: tableViewWrapper.leadingAnchor),
|
||||||
tableViewWrapper.trailingAnchor.constraint(equalTo: tableView.trailingAnchor),
|
tableViewWrapper.trailingAnchor.constraint(equalTo: tableView.trailingAnchor),
|
||||||
tableViewWrapper.bottomAnchor.constraint(equalTo: tableView.bottomAnchor),
|
tableViewWrapper.bottomAnchor.constraint(greaterThanOrEqualTo: tableView.bottomAnchor),
|
||||||
|
|
||||||
navigationActionView.leadingAnchor.constraint(equalTo: leadingAnchor),
|
navigationActionView.leadingAnchor.constraint(equalTo: leadingAnchor),
|
||||||
navigationActionView.trailingAnchor.constraint(equalTo: trailingAnchor),
|
navigationActionView.trailingAnchor.constraint(equalTo: trailingAnchor),
|
||||||
|
@ -104,26 +106,18 @@ class MastodonLoginView: UIView {
|
||||||
}
|
}
|
||||||
|
|
||||||
func updateCorners(numberOfResults: Int = 0) {
|
func updateCorners(numberOfResults: Int = 0) {
|
||||||
let tableViewPath = UIBezierPath(roundedRect:tableViewWrapper.bounds,
|
|
||||||
byRoundingCorners: [.bottomLeft, .bottomRight],
|
|
||||||
cornerRadii: CGSize(width: 10, height: 10))
|
|
||||||
|
|
||||||
let tableViewMask = CAShapeLayer()
|
tableView.isHidden = (numberOfResults == 0)
|
||||||
tableViewMask.path = tableViewPath.cgPath
|
tableViewWrapper.layer.maskedCorners = [.layerMinXMaxYCorner, .layerMaxXMaxYCorner] // tableViewMask
|
||||||
tableViewWrapper.layer.mask = tableViewMask
|
|
||||||
|
let maskedCorners: CACornerMask
|
||||||
|
|
||||||
let searchFieldCorners: UIRectCorner
|
|
||||||
if numberOfResults == 0 {
|
if numberOfResults == 0 {
|
||||||
searchFieldCorners = .allCorners
|
maskedCorners = [.layerMinXMinYCorner, .layerMinXMaxYCorner, .layerMaxXMinYCorner, .layerMaxXMaxYCorner]
|
||||||
} else {
|
} else {
|
||||||
searchFieldCorners = [.topLeft, .topRight]
|
maskedCorners = [.layerMinXMinYCorner, .layerMaxXMinYCorner]
|
||||||
}
|
}
|
||||||
|
|
||||||
let searchFieldPath = UIBezierPath(roundedRect: searchTextField.bounds,
|
searchTextField.layer.maskedCorners = maskedCorners
|
||||||
byRoundingCorners: searchFieldCorners,
|
|
||||||
cornerRadii: CGSize(width: 10, height: 10))
|
|
||||||
let searchFieldMask = CAShapeLayer()
|
|
||||||
searchFieldMask.path = searchFieldPath.cgPath
|
|
||||||
searchTextField.layer.mask = searchFieldMask
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
|
@ -83,12 +83,22 @@ class MastodonLoginViewController: UIViewController {
|
||||||
cell.backgroundColor = .systemBackground
|
cell.backgroundColor = .systemBackground
|
||||||
}
|
}
|
||||||
|
|
||||||
|
if self.viewModel.serverList.last == server {
|
||||||
|
cell.layer.maskedCorners = [.layerMinXMaxYCorner, .layerMaxXMaxYCorner]
|
||||||
|
cell.layer.cornerRadius = 10
|
||||||
|
cell.layer.masksToBounds = true
|
||||||
|
} else {
|
||||||
|
cell.layer.masksToBounds = false
|
||||||
|
}
|
||||||
|
|
||||||
return cell
|
return cell
|
||||||
}
|
}
|
||||||
|
|
||||||
contentView.tableView.dataSource = dataSource
|
contentView.tableView.dataSource = dataSource
|
||||||
self.dataSource = dataSource
|
self.dataSource = dataSource
|
||||||
|
|
||||||
|
contentView.updateCorners()
|
||||||
|
|
||||||
defer { setupNavigationBarBackgroundView() }
|
defer { setupNavigationBarBackgroundView() }
|
||||||
setupOnboardingAppearance()
|
setupOnboardingAppearance()
|
||||||
}
|
}
|
||||||
|
@ -187,9 +197,11 @@ extension MastodonLoginViewController: MastodonLoginViewModelDelegate {
|
||||||
snapshot.appendSections([MastodonLoginViewSection.servers])
|
snapshot.appendSections([MastodonLoginViewSection.servers])
|
||||||
snapshot.appendItems(viewModel.serverList)
|
snapshot.appendItems(viewModel.serverList)
|
||||||
|
|
||||||
dataSource?.applySnapshot(snapshot, animated: true)
|
dataSource?.applySnapshot(snapshot, animated: false)
|
||||||
|
|
||||||
OperationQueue.main.addOperation {
|
OperationQueue.main.addOperation {
|
||||||
self.contentView.updateCorners(numberOfResults: viewModel.serverList.count)
|
let numberOfResults = viewModel.serverList.count
|
||||||
|
self.contentView.updateCorners(numberOfResults: numberOfResults)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
Loading…
Reference in New Issue