Dwayne Harris 4 years ago
parent
commit
a4ffb1f94b
  1. 2
      Frameworks/Alamofire
  2. 16
      elpha-ios.xcodeproj/project.pbxproj
  3. 2
      elpha-ios/AbstractStatusTableViewController.swift
  4. 15
      elpha-ios/AccountSearchTableViewCell.swift
  5. 16
      elpha-ios/AccountTableViewController.swift
  6. 2
      elpha-ios/AlertManager.swift
  7. 5
      elpha-ios/AppDelegate.swift
  8. 12
      elpha-ios/Assets.xcassets/Icons/Search.imageset/Contents.json
  9. BIN
      elpha-ios/Assets.xcassets/Icons/Search.imageset/search.pdf
  10. 29
      elpha-ios/AttachmentsView.swift
  11. 2
      elpha-ios/AttachmentsView.xib
  12. 264
      elpha-ios/Base.lproj/Main.storyboard
  13. 6
      elpha-ios/ComposeViewController.swift
  14. 3
      elpha-ios/Elpha.xcdatamodeld/Elpha.xcdatamodel/contents
  15. 13
      elpha-ios/HashtagSearchTableViewCell.swift
  16. 3
      elpha-ios/InstancesDataManager.swift
  17. 1
      elpha-ios/MastodonDataManager.swift
  18. 147
      elpha-ios/SearchTableViewController.swift
  19. 13
      elpha-ios/StatusSearchTableViewCell.swift
  20. 24
      elpha-ios/StatusTableViewController.swift
  21. 10
      elpha-ios/StatusView.swift
  22. 6
      elpha-ios/StatusView.xib
  23. 45
      elpha-ios/TimelineTableViewController.swift
  24. 4
      elpha-ios/TimelinesViewController.swift

2
Frameworks/Alamofire

@ -1 +1 @@
Subproject commit 61a780f3b58ee0d2bb76fdb7b89dbc9751d521d7
Subproject commit 32573d05b91d8b7349ca31b4726e80212483f02a

16
elpha-ios.xcodeproj/project.pbxproj

@ -27,6 +27,10 @@
153418A221A0EEAC002F5F8A /* AttachmentInputView.swift in Sources */ = {isa = PBXBuildFile; fileRef = 153418A121A0EEAC002F5F8A /* AttachmentInputView.swift */; };
153418A421A0EEED002F5F8A /* AttachmentInputView.xib in Resources */ = {isa = PBXBuildFile; fileRef = 153418A321A0EEED002F5F8A /* AttachmentInputView.xib */; };
1539509121894A38009BA6E7 /* AlertManager.swift in Sources */ = {isa = PBXBuildFile; fileRef = 1539509021894A38009BA6E7 /* AlertManager.swift */; };
153C2BAA21B1DAA1009414C2 /* SearchTableViewController.swift in Sources */ = {isa = PBXBuildFile; fileRef = 153C2BA921B1DAA1009414C2 /* SearchTableViewController.swift */; };
153C2BB921B1ED09009414C2 /* AccountSearchTableViewCell.swift in Sources */ = {isa = PBXBuildFile; fileRef = 153C2BB821B1ED09009414C2 /* AccountSearchTableViewCell.swift */; };
153C2BBB21B1EEC9009414C2 /* StatusSearchTableViewCell.swift in Sources */ = {isa = PBXBuildFile; fileRef = 153C2BBA21B1EEC9009414C2 /* StatusSearchTableViewCell.swift */; };
153C2BBD21B1EEE3009414C2 /* HashtagSearchTableViewCell.swift in Sources */ = {isa = PBXBuildFile; fileRef = 153C2BBC21B1EEE3009414C2 /* HashtagSearchTableViewCell.swift */; };
1564316521A15B2E00816382 /* Alamofire.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 157405C3215890BC00EEAAEB /* Alamofire.framework */; };
1564316621A15B2E00816382 /* Alamofire.framework in Embed Frameworks */ = {isa = PBXBuildFile; fileRef = 157405C3215890BC00EEAAEB /* Alamofire.framework */; settings = {ATTRIBUTES = (CodeSignOnCopy, RemoveHeadersOnCopy, ); }; };
1564316E21A15B5400816382 /* Kingfisher.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 156370B0219FE22E00D51D42 /* Kingfisher.framework */; };
@ -226,6 +230,10 @@
153418A121A0EEAC002F5F8A /* AttachmentInputView.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = AttachmentInputView.swift; sourceTree = "<group>"; };
153418A321A0EEED002F5F8A /* AttachmentInputView.xib */ = {isa = PBXFileReference; lastKnownFileType = file.xib; path = AttachmentInputView.xib; sourceTree = "<group>"; };
1539509021894A38009BA6E7 /* AlertManager.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = AlertManager.swift; sourceTree = "<group>"; };
153C2BA921B1DAA1009414C2 /* SearchTableViewController.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = SearchTableViewController.swift; sourceTree = "<group>"; };
153C2BB821B1ED09009414C2 /* AccountSearchTableViewCell.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = AccountSearchTableViewCell.swift; sourceTree = "<group>"; };
153C2BBA21B1EEC9009414C2 /* StatusSearchTableViewCell.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = StatusSearchTableViewCell.swift; sourceTree = "<group>"; };
153C2BBC21B1EEE3009414C2 /* HashtagSearchTableViewCell.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = HashtagSearchTableViewCell.swift; sourceTree = "<group>"; };
15637094219FE22E00D51D42 /* Kingfisher.xcodeproj */ = {isa = PBXFileReference; lastKnownFileType = "wrapper.pb-project"; name = Kingfisher.xcodeproj; path = Frameworks/Kingfisher/Kingfisher.xcodeproj; sourceTree = "<group>"; };
1569029F219A7D75002BF61F /* ComposeViewController.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = ComposeViewController.swift; sourceTree = "<group>"; };
156FF014217289380074D9CA /* AccountTableViewCell.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = AccountTableViewCell.swift; sourceTree = "<group>"; };
@ -332,10 +340,13 @@
151AD4AE2166DD3500F07403 /* Table View Cells */ = {
isa = PBXGroup;
children = (
153C2BB821B1ED09009414C2 /* AccountSearchTableViewCell.swift */,
156FF014217289380074D9CA /* AccountTableViewCell.swift */,
152FBCF1219818AD0079B3E8 /* FieldTableViewCell.swift */,
153C2BBC21B1EEE3009414C2 /* HashtagSearchTableViewCell.swift */,
159048AE214F5015004F4014 /* InstancesTableViewCell.swift */,
156FF04E2175CDBC0074D9CA /* MainStatusTableViewCell.swift */,
153C2BBA21B1EEC9009414C2 /* StatusSearchTableViewCell.swift */,
156FF050217683270074D9CA /* StatusTableViewCell.swift */,
15BB72AA2171A8D4002F1FA4 /* TimelinesTableViewCell.swift */,
159026AD2162CF5600D362DD /* TimelineTableViewCell.swift */,
@ -479,6 +490,7 @@
15960E83213774FC00C38CE9 /* InstancesTableViewController.swift */,
157405A72150588A00EEAAEB /* InstanceViewController.swift */,
15960E792132387A00C38CE9 /* MainTabBarController.swift */,
153C2BA921B1DAA1009414C2 /* SearchTableViewController.swift */,
1506C57F2199709200EFB483 /* SettingsTableViewController.swift */,
156FF0302174797E0074D9CA /* StatusTableViewController.swift */,
15960E812136668500C38CE9 /* TimelinesNavigationController.swift */,
@ -706,6 +718,7 @@
156FF0312174797E0074D9CA /* StatusTableViewController.swift in Sources */,
152FB0F8218ADC1A001D6574 /* AttachmentPageViewController.swift in Sources */,
15131EF4216DB8B90092B252 /* AccountTableViewController.swift in Sources */,
153C2BBD21B1EEE3009414C2 /* HashtagSearchTableViewCell.swift in Sources */,
1534189E21A0E19F002F5F8A /* VisibilityInputView.swift in Sources */,
156902A0219A7D75002BF61F /* ComposeViewController.swift in Sources */,
15F998352162C0E8009E58DA /* MastodonDataManager.swift in Sources */,
@ -725,6 +738,7 @@
15960E7721322C6F00C38CE9 /* Configuration.swift in Sources */,
156FF07021779C570074D9CA /* MastodonAPI.swift in Sources */,
15341866219FF29D002F5F8A /* SettingsManager.swift in Sources */,
153C2BAA21B1DAA1009414C2 /* SearchTableViewController.swift in Sources */,
15A9AFE721AFA243008789E8 /* AttachmentsView.swift in Sources */,
15C91A04216AB32500D97DC3 /* AlertView.swift in Sources */,
15131EF6216DBA820092B252 /* AccountNavigationController.swift in Sources */,
@ -735,6 +749,8 @@
156FF051217683270074D9CA /* StatusTableViewCell.swift in Sources */,
159026D02163069600D362DD /* Date+TimeAgo.swift in Sources */,
152FBCD2219682E80079B3E8 /* AbstractStatusTableViewController.swift in Sources */,
153C2BB921B1ED09009414C2 /* AccountSearchTableViewCell.swift in Sources */,
153C2BBB21B1EEC9009414C2 /* StatusSearchTableViewCell.swift in Sources */,
15A79B43215EB959007A326E /* CoreDataManager.swift in Sources */,
15BB72AB2171A8D4002F1FA4 /* TimelinesTableViewCell.swift in Sources */,
156FF015217289380074D9CA /* AccountTableViewCell.swift in Sources */,

2
elpha-ios/AbstractStatusTableViewController.swift

@ -105,7 +105,7 @@ class AbstractStatusTableViewController: UITableViewController, StatusViewDelega
}
cell.statusView.update(withStatus: status)
cell.statusView.topDividerView.isHidden = false
cell.statusView.topDividerView.isHidden = indexPath.row == 0
cell.statusView.topLoadMoreView.isHidden = true
cell.statusView.bottomLoadMoreView.isHidden = true

15
elpha-ios/AccountSearchTableViewCell.swift

@ -0,0 +1,15 @@
//
// AccountSearchTableViewCell.swift
// elpha-ios
//
// Created by Dwayne Harris on 11/30/18.
// Copyright © 2018 Elpha. All rights reserved.
//
import UIKit
class AccountSearchTableViewCell: UITableViewCell {
@IBOutlet var avatarImageView: UIImageView!
@IBOutlet var displayNameLabel: UILabel!
@IBOutlet var usernameLabel: UILabel!
}

16
elpha-ios/AccountTableViewController.swift

@ -375,15 +375,15 @@ extension AccountTableViewController: NSFetchedResultsControllerDelegate {
return 1
}
override func tableView(_ tableView: UITableView, willDisplay cell: UITableViewCell, forRowAt indexPath: IndexPath) {
if let cell = cell as? AccountTableViewCell {
CellHeightManager.set(status: cell.statusView.status, height: cell.frame.size.height)
}
}
// override func tableView(_ tableView: UITableView, willDisplay cell: UITableViewCell, forRowAt indexPath: IndexPath) {
// if let cell = cell as? AccountTableViewCell {
// CellHeightManager.set(status: cell.statusView.status, height: cell.frame.size.height)
// }
// }
override func tableView(_ tableView: UITableView, estimatedHeightForRowAt indexPath: IndexPath) -> CGFloat {
return CellHeightManager.get(status: fetchedResultsController?.object(at: indexPath))
}
// override func tableView(_ tableView: UITableView, estimatedHeightForRowAt indexPath: IndexPath) -> CGFloat {
// return CellHeightManager.get(status: fetchedResultsController?.object(at: indexPath))
// }
override func tableView(_ tableView: UITableView, numberOfRowsInSection section: Int) -> Int {
return fetchedResultsController?.fetchedObjects?.count ?? 0

2
elpha-ios/AlertManager.swift

@ -112,7 +112,7 @@ class AlertManager {
}
}
print("ALERT: \(message)")
print("Alert: \(message)")
alerts.append(Alert(category: category, message: message))
start()

5
elpha-ios/AppDelegate.swift

@ -11,6 +11,7 @@ import UIKit
extension Notification.Name {
static let didAuthenticate = Notification.Name("didAuthenticate")
static let didUnauthenticate = Notification.Name("didUnauthenticate")
static let didBecomeActive = Notification.Name("didBecomeActive")
}
@UIApplicationMain
@ -28,5 +29,9 @@ class AppDelegate: UIResponder, UIApplicationDelegate {
return true
}
func applicationDidBecomeActive(_ application: UIApplication) {
// NotificationCenter.default.post(name: .didBecomeActive, object: nil)
}
}

12
elpha-ios/Assets.xcassets/Icons/Search.imageset/Contents.json

@ -0,0 +1,12 @@
{
"images" : [
{
"idiom" : "universal",
"filename" : "search.pdf"
}
],
"info" : {
"version" : 1,
"author" : "xcode"
}
}

BIN
elpha-ios/Assets.xcassets/Icons/Search.imageset/search.pdf

29
elpha-ios/AttachmentsView.swift

@ -33,7 +33,7 @@ class AttachmentsView: UIView {
Bundle.main.loadNibNamed("AttachmentsView", owner: self, options: nil)
addSubview(contentView)
contentView.frame = self.bounds
contentView.autoresizingMask = [.flexibleWidth, .flexibleHeight]
contentView.autoresizingMask = [.flexibleWidth]
attachmentsCollectionView.dataSource = self
attachmentsCollectionView.delegate = self
@ -43,15 +43,18 @@ class AttachmentsView: UIView {
}
func update(withAttachments attachments: [AttachmentMO]) {
self.attachments = attachments
attachmentsCollectionView.collectionViewLayout.invalidateLayout()
self.attachments = Array(attachments.prefix(4))
attachmentsCollectionView.reloadData()
attachmentsCollectionView.setNeedsLayout()
attachmentsCollectionView.collectionViewLayout.invalidateLayout()
}
}
extension AttachmentsView: UICollectionViewDelegate, UICollectionViewDataSource {
func numberOfSections(in collectionView: UICollectionView) -> Int {
return 1
}
func collectionView(_ collectionView: UICollectionView, numberOfItemsInSection section: Int) -> Int {
return attachments?.count ?? 0
}
@ -67,12 +70,10 @@ extension AttachmentsView: UICollectionViewDelegate, UICollectionViewDataSource
case .gifv, .video:
let cell = collectionView.dequeueReusableCell(withReuseIdentifier: "VideoAttachmentCollectionViewCell", for: indexPath) as! VideoAttachmentCollectionViewCell
cell.update(withAttachment: attachment)
return cell
default:
let cell = collectionView.dequeueReusableCell(withReuseIdentifier: "ImageAttachmentCollectionViewCell", for: indexPath) as! ImageAttachmentCollectionViewCell
cell.update(withAttachment: attachment)
return cell
}
}
@ -84,12 +85,16 @@ extension AttachmentsView: UICollectionViewDelegate, UICollectionViewDataSource
extension AttachmentsView: UICollectionViewDelegateFlowLayout {
func collectionView(_ collectionView: UICollectionView, layout collectionViewLayout: UICollectionViewLayout, sizeForItemAt indexPath: IndexPath) -> CGSize {
let halfWidth = (frame.size.width / 2) - 1
let tallSize = CGSize(width: halfWidth, height: frame.size.width)
let smallSize = CGSize(width: halfWidth, height: halfWidth)
print("collectionView sizeForItemAt indexPath: \(indexPath)")
let halfWidth = (frame.size.width / 2) - 2
let halfHeight = (frame.size.height / 2) - 2
let tallSize = CGSize(width: halfWidth, height: frame.size.height)
let smallSize = CGSize(width: halfWidth, height: halfHeight)
switch attachments?.count ?? 0 {
case 1: return CGSize(width: frame.size.width, height: frame.size.width)
case 1: return CGSize(width: frame.size.width, height: frame.size.height)
case 2: return tallSize
case 3: return indexPath.row == 0 ? tallSize : smallSize
case 4: return smallSize
@ -102,7 +107,7 @@ extension AttachmentsView: UICollectionViewDelegateFlowLayout {
}
func collectionView(_ collectionView: UICollectionView, layout collectionViewLayout: UICollectionViewLayout, minimumInteritemSpacingForSectionAt section: Int) -> CGFloat {
return 2
return 4
}
func collectionView(_ collectionView: UICollectionView, layout collectionViewLayout: UICollectionViewLayout, insetForSectionAt section: Int) -> UIEdgeInsets {

2
elpha-ios/AttachmentsView.xib

@ -24,7 +24,7 @@
<collectionView clipsSubviews="YES" multipleTouchEnabled="YES" contentMode="scaleToFill" scrollEnabled="NO" showsHorizontalScrollIndicator="NO" showsVerticalScrollIndicator="NO" dataMode="none" prefetchingEnabled="NO" translatesAutoresizingMaskIntoConstraints="NO" id="XgR-gy-s01">
<rect key="frame" x="0.0" y="0.0" width="375" height="375"/>
<color key="backgroundColor" white="1" alpha="1" colorSpace="custom" customColorSpace="genericGamma22GrayColorSpace"/>
<collectionViewFlowLayout key="collectionViewLayout" scrollDirection="horizontal" minimumLineSpacing="10" minimumInteritemSpacing="10" id="aaI-cP-xj8">
<collectionViewFlowLayout key="collectionViewLayout" scrollDirection="horizontal" minimumLineSpacing="2" minimumInteritemSpacing="4" id="aaI-cP-xj8">
<size key="itemSize" width="50" height="50"/>
<size key="headerReferenceSize" width="0.0" height="0.0"/>
<size key="footerReferenceSize" width="0.0" height="0.0"/>

264
elpha-ios/Base.lproj/Main.storyboard

@ -1,11 +1,11 @@
<?xml version="1.0" encoding="UTF-8"?>
<document type="com.apple.InterfaceBuilder3.CocoaTouch.Storyboard.XIB" version="3.0" toolsVersion="14460.31" targetRuntime="iOS.CocoaTouch" propertyAccessControl="none" useAutolayout="YES" useTraitCollections="YES" useSafeAreas="YES" colorMatched="YES" initialViewController="49e-Tb-3d3">
<document type="com.apple.InterfaceBuilder3.CocoaTouch.Storyboard.XIB" version="3.0" toolsVersion="14490.70" targetRuntime="iOS.CocoaTouch" propertyAccessControl="none" useAutolayout="YES" useTraitCollections="YES" useSafeAreas="YES" colorMatched="YES" initialViewController="49e-Tb-3d3">
<device id="retina5_9" orientation="portrait">
<adaptation id="fullscreen"/>
</device>
<dependencies>
<deployment identifier="iOS"/>
<plugIn identifier="com.apple.InterfaceBuilder.IBCocoaTouchPlugin" version="14460.20"/>
<plugIn identifier="com.apple.InterfaceBuilder.IBCocoaTouchPlugin" version="14490.49"/>
<capability name="Named colors" minToolsVersion="9.0"/>
<capability name="Safe area layout guides" minToolsVersion="9.0"/>
<capability name="documents saved in the Xcode 8 format" minToolsVersion="8.0"/>
@ -158,7 +158,7 @@
<constraint firstAttribute="height" constant="16" id="aZP-9T-7kG"/>
</constraints>
<fontDescription key="fontDescription" type="system" pointSize="13"/>
<color key="textColor" name="Secondary"/>
<color key="textColor" name="Primary"/>
<nil key="highlightedColor"/>
</label>
<label opaque="NO" userInteractionEnabled="NO" contentMode="left" horizontalHuggingPriority="251" verticalHuggingPriority="251" text="Label" lineBreakMode="tailTruncation" baselineAdjustment="alignBaselines" adjustsFontSizeToFit="NO" translatesAutoresizingMaskIntoConstraints="NO" id="4n9-eS-zCc">
@ -188,7 +188,7 @@
<constraint firstAttribute="height" constant="16" id="cyk-90-Tuq"/>
</constraints>
<fontDescription key="fontDescription" type="system" pointSize="13"/>
<color key="textColor" name="Secondary"/>
<color key="textColor" name="Primary"/>
<nil key="highlightedColor"/>
</label>
<label opaque="NO" userInteractionEnabled="NO" contentMode="left" horizontalHuggingPriority="251" verticalHuggingPriority="251" text="Label" lineBreakMode="tailTruncation" baselineAdjustment="alignBaselines" adjustsFontSizeToFit="NO" translatesAutoresizingMaskIntoConstraints="NO" id="4fE-NE-pXx">
@ -301,7 +301,7 @@
<constraint firstAttribute="height" constant="16" id="BOa-EW-chw"/>
</constraints>
<fontDescription key="fontDescription" type="system" pointSize="13"/>
<color key="textColor" name="Secondary"/>
<color key="textColor" name="Primary"/>
<nil key="highlightedColor"/>
</label>
<label opaque="NO" userInteractionEnabled="NO" contentMode="left" horizontalHuggingPriority="251" verticalHuggingPriority="251" text="Label" lineBreakMode="tailTruncation" baselineAdjustment="alignBaselines" adjustsFontSizeToFit="NO" translatesAutoresizingMaskIntoConstraints="NO" id="ad5-DU-QLI">
@ -333,7 +333,7 @@
<constraint firstAttribute="height" constant="16" id="ttv-xx-js7"/>
</constraints>
<fontDescription key="fontDescription" type="system" pointSize="13"/>
<color key="textColor" name="Secondary"/>
<color key="textColor" name="Primary"/>
<nil key="highlightedColor"/>
</label>
<label opaque="NO" userInteractionEnabled="NO" contentMode="left" horizontalHuggingPriority="251" verticalHuggingPriority="251" text="Label" lineBreakMode="tailTruncation" baselineAdjustment="alignBaselines" adjustsFontSizeToFit="NO" translatesAutoresizingMaskIntoConstraints="NO" id="npd-Y6-d6W">
@ -365,7 +365,7 @@
<constraint firstAttribute="height" constant="16" id="HIC-Cl-aHL"/>
</constraints>
<fontDescription key="fontDescription" type="system" pointSize="13"/>
<color key="textColor" name="Secondary"/>
<color key="textColor" name="Primary"/>
<nil key="highlightedColor"/>
</label>
<label opaque="NO" userInteractionEnabled="NO" contentMode="left" horizontalHuggingPriority="251" verticalHuggingPriority="251" text="Label" lineBreakMode="tailTruncation" baselineAdjustment="alignBaselines" adjustsFontSizeToFit="NO" translatesAutoresizingMaskIntoConstraints="NO" id="Rfc-EP-QB2">
@ -397,7 +397,7 @@
<constraint firstAttribute="height" constant="16" id="pdS-qH-b3B"/>
</constraints>
<fontDescription key="fontDescription" type="system" pointSize="13"/>
<color key="textColor" name="Secondary"/>
<color key="textColor" name="Primary"/>
<nil key="highlightedColor"/>
</label>
<label opaque="NO" userInteractionEnabled="NO" contentMode="left" horizontalHuggingPriority="251" verticalHuggingPriority="251" text="Label" lineBreakMode="tailTruncation" baselineAdjustment="alignBaselines" adjustsFontSizeToFit="NO" translatesAutoresizingMaskIntoConstraints="NO" id="SL3-SA-8IS">
@ -480,11 +480,11 @@
<objects>
<tableViewController storyboardIdentifier="AccountTableViewController" id="X5f-Me-0D2" customClass="AccountTableViewController" customModule="elpha_ios" customModuleProvider="target" sceneMemberID="viewController">
<tableView key="view" clipsSubviews="YES" contentMode="scaleToFill" alwaysBounceVertical="YES" dataMode="prototypes" style="plain" separatorStyle="none" allowsSelection="NO" rowHeight="-1" estimatedRowHeight="-1" sectionHeaderHeight="28" sectionFooterHeight="28" id="BA3-TV-fdC">
<rect key="frame" x="0.0" y="0.0" width="375" height="900"/>
<rect key="frame" x="0.0" y="0.0" width="375" height="812"/>
<autoresizingMask key="autoresizingMask" widthSizable="YES" heightSizable="YES"/>
<color key="backgroundColor" white="1" alpha="1" colorSpace="custom" customColorSpace="genericGamma22GrayColorSpace"/>
<view key="tableHeaderView" contentMode="scaleToFill" id="ygB-F6-Moa">
<rect key="frame" x="0.0" y="0.0" width="375" height="575"/>
<rect key="frame" x="0.0" y="0.0" width="375" height="487"/>
<autoresizingMask key="autoresizingMask" heightSizable="YES"/>
<subviews>
<imageView clipsSubviews="YES" userInteractionEnabled="NO" contentMode="scaleAspectFill" horizontalHuggingPriority="251" verticalHuggingPriority="251" translatesAutoresizingMaskIntoConstraints="NO" id="0jO-Rb-lcz">
@ -608,7 +608,7 @@
<stackView opaque="NO" contentMode="scaleToFill" axis="vertical" translatesAutoresizingMaskIntoConstraints="NO" id="deT-ms-U3E">
<rect key="frame" x="0.0" y="254" width="375" height="188"/>
<subviews>
<view contentMode="scaleToFill" translatesAutoresizingMaskIntoConstraints="NO" id="uXA-ni-Ikc">
<view contentMode="scaleToFill" verticalHuggingPriority="255" verticalCompressionResistancePriority="755" translatesAutoresizingMaskIntoConstraints="NO" id="uXA-ni-Ikc">
<rect key="frame" x="0.0" y="0.0" width="375" height="76.333333333333329"/>
<subviews>
<textView clipsSubviews="YES" multipleTouchEnabled="YES" contentMode="scaleToFill" scrollEnabled="NO" editable="NO" text="Note" textAlignment="center" translatesAutoresizingMaskIntoConstraints="NO" id="7EZ-R5-qfQ" customClass="UITextViewFixed" customModule="elpha_ios" customModuleProvider="target">
@ -632,7 +632,7 @@
<view contentMode="scaleToFill" translatesAutoresizingMaskIntoConstraints="NO" id="qdo-DJ-E9W">
<rect key="frame" x="0.0" y="76.333333333333314" width="375" height="111.66666666666669"/>
<subviews>
<tableView clipsSubviews="YES" contentMode="scaleToFill" alwaysBounceVertical="YES" scrollEnabled="NO" dataMode="prototypes" style="plain" separatorStyle="default" allowsSelection="NO" rowHeight="40" estimatedRowHeight="-1" sectionHeaderHeight="28" sectionFooterHeight="28" translatesAutoresizingMaskIntoConstraints="NO" id="LkG-MC-taI">
<tableView clipsSubviews="YES" contentMode="scaleToFill" verticalHuggingPriority="251" alwaysBounceVertical="YES" scrollEnabled="NO" dataMode="prototypes" style="plain" separatorStyle="default" allowsSelection="NO" rowHeight="40" estimatedRowHeight="-1" sectionHeaderHeight="28" sectionFooterHeight="28" translatesAutoresizingMaskIntoConstraints="NO" id="LkG-MC-taI">
<rect key="frame" x="0.0" y="0.0" width="375" height="111.66666666666667"/>
<color key="backgroundColor" white="1" alpha="1" colorSpace="custom" customColorSpace="genericGamma22GrayColorSpace"/>
<inset key="separatorInset" minX="5" minY="0.0" maxX="0.0" maxY="0.0"/>
@ -723,10 +723,10 @@
</view>
<prototypes>
<tableViewCell clipsSubviews="YES" contentMode="scaleToFill" preservesSuperviewLayoutMargins="YES" selectionStyle="default" indentationWidth="10" reuseIdentifier="AccountTableViewCell" id="nLQ-4Q-SwI" customClass="AccountTableViewCell" customModule="elpha_ios" customModuleProvider="target">
<rect key="frame" x="0.0" y="884" width="375" height="44"/>
<rect key="frame" x="0.0" y="603" width="375" height="44"/>
<autoresizingMask key="autoresizingMask"/>
<tableViewCellContentView key="contentView" opaque="NO" clipsSubviews="YES" multipleTouchEnabled="YES" contentMode="center" preservesSuperviewLayoutMargins="YES" insetsLayoutMarginsFromSafeArea="NO" tableViewCell="nLQ-4Q-SwI" id="y0d-Ka-W2g">
<rect key="frame" x="0.0" y="0.0" width="375" height="43.666666666666664"/>
<rect key="frame" x="0.0" y="0.0" width="375" height="44"/>
<autoresizingMask key="autoresizingMask"/>
<subviews>
<view contentMode="scaleToFill" translatesAutoresizingMaskIntoConstraints="NO" id="XFR-lZ-fvp" customClass="StatusView" customModule="elpha_ios" customModuleProvider="target">
@ -785,33 +785,232 @@
<rect key="frame" x="0.0" y="975" width="768" height="49"/>
<autoresizingMask key="autoresizingMask" widthSizable="YES" flexibleMinY="YES"/>
<color key="tintColor" red="0.54117647059999996" green="0.4823529412" blue="0.68235294120000001" alpha="1" colorSpace="calibratedRGB"/>
<color key="selectedImageTintColor" red="0.54117647059999996" green="0.4823529412" blue="0.68235294120000001" alpha="1" colorSpace="calibratedRGB"/>
<color key="selectedImageTintColor" name="Secondary"/>
</tabBar>
<connections>
<segue destination="tkS-C2-D40" kind="relationship" relationship="viewControllers" id="u7Y-xg-7CH"/>
<segue destination="lZk-Km-KQ7" kind="relationship" relationship="viewControllers" id="lzU-1b-eKA"/>
<segue destination="Bed-pj-wE9" kind="presentation" identifier="AuthenticateSegue" id="OY3-ks-sfC"/>
<segue destination="iMt-kb-0Mu" kind="relationship" relationship="viewControllers" id="jje-mv-pnt"/>
</connections>
</tabBarController>
<placeholder placeholderIdentifier="IBFirstResponder" id="HuB-VB-40B" sceneMemberID="firstResponder"/>
</objects>
<point key="canvasLocation" x="0.0" y="0.0"/>
</scene>
<!--Search-->
<scene sceneID="3f5-d8-0Vd">
<objects>
<tableViewController id="M9y-D3-v4x" customClass="SearchTableViewController" customModule="elpha_ios" customModuleProvider="target" sceneMemberID="viewController">
<tableView key="view" clipsSubviews="YES" contentMode="scaleToFill" alwaysBounceVertical="YES" dataMode="prototypes" style="plain" separatorStyle="none" rowHeight="-1" estimatedRowHeight="-1" sectionHeaderHeight="28" sectionFooterHeight="28" id="z9L-DH-7rG">
<rect key="frame" x="0.0" y="0.0" width="375" height="812"/>
<autoresizingMask key="autoresizingMask" widthSizable="YES" heightSizable="YES"/>
<color key="backgroundColor" white="1" alpha="1" colorSpace="custom" customColorSpace="genericGamma22GrayColorSpace"/>
<inset key="separatorInset" minX="5" minY="0.0" maxX="0.0" maxY="0.0"/>
<view key="tableHeaderView" contentMode="scaleToFill" id="taM-ka-A6E">
<rect key="frame" x="0.0" y="0.0" width="375" height="119"/>
<autoresizingMask key="autoresizingMask" flexibleMaxX="YES" flexibleMaxY="YES"/>
<subviews>
<searchBar contentMode="redraw" translatesAutoresizingMaskIntoConstraints="NO" id="ifO-L7-s8t">
<rect key="frame" x="0.0" y="0.0" width="375" height="56"/>
<constraints>
<constraint firstAttribute="height" constant="56" id="rGd-FK-dMZ"/>
</constraints>
<color key="barTintColor" name="Secondary"/>
<textInputTraits key="textInputTraits" autocorrectionType="no" spellCheckingType="no" returnKeyType="search" smartDashesType="no" smartInsertDeleteType="no" smartQuotesType="no"/>
<scopeButtonTitles>
<string>Title</string>
<string>Title</string>
</scopeButtonTitles>
</searchBar>
<segmentedControl opaque="NO" contentMode="scaleToFill" contentHorizontalAlignment="left" contentVerticalAlignment="top" segmentControlStyle="plain" selectedSegmentIndex="0" translatesAutoresizingMaskIntoConstraints="NO" id="s16-Wn-To1">
<rect key="frame" x="20" y="71" width="335" height="29"/>
<segments>
<segment title="Accounts"/>
<segment title="Hashtags"/>
</segments>
<color key="tintColor" name="Secondary"/>
<connections>
<action selector="searchSegmentedControlTapped:" destination="M9y-D3-v4x" eventType="valueChanged" id="hLP-ud-cB4"/>
</connections>
</segmentedControl>
</subviews>
<color key="backgroundColor" white="1" alpha="1" colorSpace="custom" customColorSpace="genericGamma22GrayColorSpace"/>
<constraints>
<constraint firstAttribute="trailing" secondItem="ifO-L7-s8t" secondAttribute="trailing" id="9yn-xs-4Jk"/>
<constraint firstItem="ifO-L7-s8t" firstAttribute="top" secondItem="taM-ka-A6E" secondAttribute="top" id="Kpk-B7-K7J"/>
<constraint firstItem="ifO-L7-s8t" firstAttribute="leading" secondItem="taM-ka-A6E" secondAttribute="leading" id="PaS-Kw-Nr0"/>
<constraint firstAttribute="trailing" secondItem="s16-Wn-To1" secondAttribute="trailing" constant="20" id="VDb-LW-2rg"/>
<constraint firstItem="s16-Wn-To1" firstAttribute="leading" secondItem="taM-ka-A6E" secondAttribute="leading" constant="20" id="pMk-xF-XCx"/>
<constraint firstItem="s16-Wn-To1" firstAttribute="top" secondItem="ifO-L7-s8t" secondAttribute="bottom" constant="15" id="xFJ-IJ-mCd"/>
</constraints>
</view>
<prototypes>
<tableViewCell clipsSubviews="YES" contentMode="scaleToFill" preservesSuperviewLayoutMargins="YES" selectionStyle="default" indentationWidth="10" reuseIdentifier="AccountSearchTableViewCell" rowHeight="100" id="mgC-Ga-gA2" customClass="AccountSearchTableViewCell" customModule="elpha_ios" customModuleProvider="target">
<rect key="frame" x="0.0" y="147" width="375" height="100"/>
<autoresizingMask key="autoresizingMask"/>
<tableViewCellContentView key="contentView" opaque="NO" clipsSubviews="YES" multipleTouchEnabled="YES" contentMode="center" ambiguous="YES" preservesSuperviewLayoutMargins="YES" insetsLayoutMarginsFromSafeArea="NO" tableViewCell="mgC-Ga-gA2" id="zw2-I0-vFr">
<rect key="frame" x="0.0" y="0.0" width="375" height="100"/>
<autoresizingMask key="autoresizingMask"/>
<subviews>
<imageView clipsSubviews="YES" userInteractionEnabled="NO" contentMode="scaleToFill" horizontalHuggingPriority="251" verticalHuggingPriority="251" translatesAutoresizingMaskIntoConstraints="NO" id="Lpv-wH-eFu">
<rect key="frame" x="16" y="26.333333333333336" width="55" height="55.000000000000007"/>
<constraints>
<constraint firstAttribute="width" constant="55" id="4DW-ge-zvD"/>
<constraint firstAttribute="height" constant="55" id="Sm2-C6-FcR"/>
</constraints>
</imageView>
<label opaque="NO" userInteractionEnabled="NO" contentMode="left" horizontalHuggingPriority="251" verticalHuggingPriority="251" text="Display Name" textAlignment="natural" lineBreakMode="tailTruncation" baselineAdjustment="alignBaselines" adjustsFontSizeToFit="NO" translatesAutoresizingMaskIntoConstraints="NO" id="ZHU-78-ovJ">
<rect key="frame" x="79" y="26.333333333333336" width="272" height="23"/>
<fontDescription key="fontDescription" type="boldSystem" pointSize="19"/>
<color key="textColor" name="Text"/>
<nil key="highlightedColor"/>
</label>
<label opaque="NO" userInteractionEnabled="NO" contentMode="left" horizontalHuggingPriority="251" verticalHuggingPriority="251" text="Username" textAlignment="natural" lineBreakMode="tailTruncation" baselineAdjustment="alignBaselines" adjustsFontSizeToFit="NO" translatesAutoresizingMaskIntoConstraints="NO" id="4ML-2W-lP9">
<rect key="frame" x="79" y="51.333333333333329" width="272" height="19.333333333333329"/>
<fontDescription key="fontDescription" type="system" pointSize="16"/>
<color key="textColor" name="Primary"/>
<nil key="highlightedColor"/>
</label>
</subviews>
<constraints>
<constraint firstItem="4ML-2W-lP9" firstAttribute="leading" secondItem="Lpv-wH-eFu" secondAttribute="trailing" constant="8" id="4Kx-JD-DTT"/>
<constraint firstItem="ZHU-78-ovJ" firstAttribute="leading" secondItem="Lpv-wH-eFu" secondAttribute="trailing" constant="8" id="JMa-fu-mVm"/>
<constraint firstAttribute="trailingMargin" secondItem="4ML-2W-lP9" secondAttribute="trailing" constant="8" id="Kb4-Ia-5VC"/>
<constraint firstItem="Lpv-wH-eFu" firstAttribute="leading" secondItem="zw2-I0-vFr" secondAttribute="leadingMargin" id="Kk8-Fd-iep"/>
<constraint firstItem="4ML-2W-lP9" firstAttribute="top" secondItem="ZHU-78-ovJ" secondAttribute="bottom" constant="2" id="MK8-fH-Z0z"/>
<constraint firstAttribute="bottomMargin" secondItem="Lpv-wH-eFu" secondAttribute="bottom" constant="15" id="O3b-bS-oRz"/>
<constraint firstAttribute="trailingMargin" secondItem="ZHU-78-ovJ" secondAttribute="trailing" constant="8" id="aKB-Ay-ZNJ"/>
<constraint firstItem="Lpv-wH-eFu" firstAttribute="top" secondItem="zw2-I0-vFr" secondAttribute="topMargin" constant="15" id="dCI-zP-6yV"/>
<constraint firstItem="ZHU-78-ovJ" firstAttribute="top" secondItem="zw2-I0-vFr" secondAttribute="topMargin" constant="15" id="zYN-AV-Z8j"/>
</constraints>
</tableViewCellContentView>
<connections>
<outlet property="avatarImageView" destination="Lpv-wH-eFu" id="MP2-p9-Rdv"/>
<outlet property="displayNameLabel" destination="ZHU-78-ovJ" id="5pI-Co-a1A"/>
<outlet property="usernameLabel" destination="4ML-2W-lP9" id="xQL-6j-ICT"/>
</connections>
</tableViewCell>
<tableViewCell clipsSubviews="YES" contentMode="scaleToFill" preservesSuperviewLayoutMargins="YES" selectionStyle="default" indentationWidth="10" reuseIdentifier="HashtagSearchTableViewCell" id="JY0-qF-xnB" customClass="HashtagSearchTableViewCell" customModule="elpha_ios" customModuleProvider="target">
<rect key="frame" x="0.0" y="247" width="375" height="44"/>
<autoresizingMask key="autoresizingMask"/>
<tableViewCellContentView key="contentView" opaque="NO" clipsSubviews="YES" multipleTouchEnabled="YES" contentMode="center" preservesSuperviewLayoutMargins="YES" insetsLayoutMarginsFromSafeArea="NO" tableViewCell="JY0-qF-xnB" id="ZNu-mK-dGP">
<rect key="frame" x="0.0" y="0.0" width="375" height="44"/>
<autoresizingMask key="autoresizingMask"/>
<subviews>
<label opaque="NO" userInteractionEnabled="NO" contentMode="left" horizontalHuggingPriority="251" verticalHuggingPriority="251" text="#hashtag" textAlignment="natural" lineBreakMode="tailTruncation" baselineAdjustment="alignBaselines" adjustsFontSizeToFit="NO" translatesAutoresizingMaskIntoConstraints="NO" id="jzi-o6-8xI">
<rect key="frame" x="16" y="11.666666666666664" width="335" height="21"/>
<fontDescription key="fontDescription" type="system" pointSize="17"/>
<color key="textColor" name="Primary"/>
<nil key="highlightedColor"/>
</label>
</subviews>
<constraints>
<constraint firstItem="jzi-o6-8xI" firstAttribute="centerY" secondItem="ZNu-mK-dGP" secondAttribute="centerY" id="1qX-nc-HY9"/>
<constraint firstAttribute="trailingMargin" secondItem="jzi-o6-8xI" secondAttribute="trailing" constant="8" id="4CK-Mu-Ui6"/>
<constraint firstItem="jzi-o6-8xI" firstAttribute="leading" secondItem="ZNu-mK-dGP" secondAttribute="leadingMargin" id="R4V-sK-51n"/>
</constraints>
</tableViewCellContentView>
<connections>
<outlet property="hashtagLabel" destination="jzi-o6-8xI" id="bom-ux-qwd"/>
</connections>
</tableViewCell>
<tableViewCell clipsSubviews="YES" contentMode="scaleToFill" preservesSuperviewLayoutMargins="YES" selectionStyle="default" indentationWidth="10" reuseIdentifier="StatusSearchTableViewCell" id="lT5-f6-cld" customClass="StatusSearchTableViewCell" customModule="elpha_ios" customModuleProvider="target">
<rect key="frame" x="0.0" y="291" width="375" height="44"/>
<autoresizingMask key="autoresizingMask"/>
<tableViewCellContentView key="contentView" opaque="NO" clipsSubviews="YES" multipleTouchEnabled="YES" contentMode="center" preservesSuperviewLayoutMargins="YES" insetsLayoutMarginsFromSafeArea="NO" tableViewCell="lT5-f6-cld" id="NKo-f8-R4D">
<rect key="frame" x="0.0" y="0.0" width="375" height="44"/>
<autoresizingMask key="autoresizingMask"/>
<subviews>
<view contentMode="scaleToFill" translatesAutoresizingMaskIntoConstraints="NO" id="Y3p-nM-13h" customClass="StatusView" customModule="elpha_ios" customModuleProvider="target">
<rect key="frame" x="0.0" y="0.0" width="375" height="44"/>
<color key="backgroundColor" white="1" alpha="1" colorSpace="custom" customColorSpace="genericGamma22GrayColorSpace"/>
</view>
</subviews>
<constraints>
<constraint firstAttribute="bottom" secondItem="Y3p-nM-13h" secondAttribute="bottom" id="O0j-d7-0sf"/>
<constraint firstItem="Y3p-nM-13h" firstAttribute="leading" secondItem="NKo-f8-R4D" secondAttribute="leading" id="mHz-l0-ttI"/>
<constraint firstItem="Y3p-nM-13h" firstAttribute="top" secondItem="NKo-f8-R4D" secondAttribute="top" id="qiQ-2e-A1n"/>
<constraint firstAttribute="trailing" secondItem="Y3p-nM-13h" secondAttribute="trailing" id="y8A-qt-L3y"/>
</constraints>
</tableViewCellContentView>
<connections>
<outlet property="statusView" destination="Y3p-nM-13h" id="CRN-yh-4Pv"/>
</connections>
</tableViewCell>
</prototypes>
<connections>
<outlet property="dataSource" destination="M9y-D3-v4x" id="kk5-aP-xIh"/>
<outlet property="delegate" destination="M9y-D3-v4x" id="My5-uC-ff8"/>
</connections>
</tableView>
<navigationItem key="navigationItem" title="Search" id="DoW-Br-a5f"/>
<connections>
<outlet property="noResultsView" destination="WIS-xY-0qq" id="abG-kW-uQO"/>
<outlet property="searchBar" destination="ifO-L7-s8t" id="eLT-WO-qT7"/>
<outlet property="searchSegmentedControl" destination="s16-Wn-To1" id="LBE-Qo-vua"/>
</connections>
</tableViewController>
<placeholder placeholderIdentifier="IBFirstResponder" id="IhO-yN-ygN" userLabel="First Responder" sceneMemberID="firstResponder"/>
<view contentMode="scaleToFill" id="WIS-xY-0qq">
<rect key="frame" x="0.0" y="0.0" width="240" height="128"/>
<autoresizingMask key="autoresizingMask" flexibleMaxX="YES" flexibleMaxY="YES"/>
<subviews>
<label opaque="NO" userInteractionEnabled="NO" contentMode="left" horizontalHuggingPriority="251" verticalHuggingPriority="251" text="No Results" textAlignment="center" lineBreakMode="tailTruncation" baselineAdjustment="alignBaselines" adjustsFontSizeToFit="NO" translatesAutoresizingMaskIntoConstraints="NO" id="3He-3v-DKX">
<rect key="frame" x="8" y="52" width="224" height="24"/>
<fontDescription key="fontDescription" type="boldSystem" pointSize="20"/>
<color key="textColor" name="Secondary"/>
<nil key="highlightedColor"/>
</label>
</subviews>
<color key="backgroundColor" white="1" alpha="1" colorSpace="custom" customColorSpace="genericGamma22GrayColorSpace"/>
<constraints>
<constraint firstItem="3He-3v-DKX" firstAttribute="centerY" secondItem="WIS-xY-0qq" secondAttribute="centerY" id="7DX-ho-dn8"/>
<constraint firstItem="3He-3v-DKX" firstAttribute="leading" secondItem="gcC-0S-JfY" secondAttribute="leading" constant="8" id="H7t-5D-Ba0"/>
<constraint firstItem="gcC-0S-JfY" firstAttribute="trailing" secondItem="3He-3v-DKX" secondAttribute="trailing" constant="8" id="TGh-qa-5Zu"/>
</constraints>
<viewLayoutGuide key="safeArea" id="gcC-0S-JfY"/>
</view>
</objects>
<point key="canvasLocation" x="1709.5999999999999" y="-1105.4187192118227"/>
</scene>
<!--Search-->
<scene sceneID="TLi-LG-vRS">
<objects>
<navigationController id="iMt-kb-0Mu" sceneMemberID="viewController">
<tabBarItem key="tabBarItem" title="Search" image="Search" selectedImage="Search" id="Y07-ap-XOZ"/>
<navigationBar key="navigationBar" contentMode="scaleToFill" insetsLayoutMarginsFromSafeArea="NO" largeTitles="YES" id="d0K-Tj-ycH">
<autoresizingMask key="autoresizingMask"/>
<color key="tintColor" name="Primary"/>
<textAttributes key="titleTextAttributes">
<color key="textColor" red="0.32549019607843138" green="0.20392156862745098" blue="0.55686274509803924" alpha="1" colorSpace="custom" customColorSpace="sRGB"/>
</textAttributes>
<textAttributes key="largeTitleTextAttributes">
<color key="textColor" red="0.32549019607843138" green="0.20392156862745098" blue="0.55686274509803924" alpha="1" colorSpace="custom" customColorSpace="sRGB"/>
</textAttributes>
</navigationBar>
<connections>
<segue destination="M9y-D3-v4x" kind="relationship" relationship="rootViewController" id="vh4-MY-LCa"/>
</connections>
</navigationController>
<placeholder placeholderIdentifier="IBFirstResponder" id="zxp-lA-vzG" userLabel="First Responder" sceneMemberID="firstResponder"/>
</objects>
<point key="canvasLocation" x="801" y="-1105"/>
</scene>
<!--Timelines-->
<scene sceneID="6LG-kd-yOU">
<objects>
<navigationController automaticallyAdjustsScrollViewInsets="NO" id="tkS-C2-D40" customClass="TimelinesNavigationController" customModule="elpha_ios" customModuleProvider="target" sceneMemberID="viewController">
<tabBarItem key="tabBarItem" title="Timelines" image="Timelines" id="acW-dT-cKf"/>
<tabBarItem key="tabBarItem" title="Timelines" image="Timelines" selectedImage="Timelines" id="acW-dT-cKf"/>
<toolbarItems/>
<navigationBar key="navigationBar" contentMode="scaleToFill" insetsLayoutMarginsFromSafeArea="NO" largeTitles="YES" id="MdH-tW-gfk">
<rect key="frame" x="0.0" y="44" width="375" height="96"/>
<autoresizingMask key="autoresizingMask"/>
<color key="tintColor" red="0.090196078430000007" green="0.047058823530000002" blue="0.28627450980000002" alpha="1" colorSpace="custom" customColorSpace="sRGB"/>
<textAttributes key="titleTextAttributes">
<color key="textColor" red="0.090196078430000007" green="0.047058823530000002" blue="0.28627450980000002" alpha="1" colorSpace="custom" customColorSpace="sRGB"/>
<color key="textColor" red="0.32549019607843138" green="0.20392156862745098" blue="0.55686274509803924" alpha="1" colorSpace="custom" customColorSpace="sRGB"/>
</textAttributes>
<textAttributes key="largeTitleTextAttributes">
<color key="textColor" red="0.090196078430000007" green="0.047058823530000002" blue="0.28627450980000002" alpha="1" colorSpace="custom" customColorSpace="sRGB"/>
<color key="textColor" red="0.32549019607843138" green="0.20392156862745098" blue="0.55686274509803924" alpha="1" colorSpace="custom" customColorSpace="sRGB"/>
</textAttributes>
</navigationBar>
<nil name="viewControllers"/>
@ -877,7 +1076,7 @@
</constraints>
</view>
<view key="tableFooterView" contentMode="scaleToFill" id="ldk-rb-fMp">
<rect key="frame" x="0.0" y="423" width="375" height="78"/>
<rect key="frame" x="0.0" y="734" width="375" height="78"/>
<autoresizingMask key="autoresizingMask" flexibleMaxX="YES" flexibleMaxY="YES"/>
<subviews>
<imageView userInteractionEnabled="NO" contentMode="scaleToFill" horizontalHuggingPriority="251" verticalHuggingPriority="251" image="Logo" translatesAutoresizingMaskIntoConstraints="NO" id="jPl-Xz-kzi">
@ -1018,7 +1217,7 @@
</tableViewController>
<placeholder placeholderIdentifier="IBFirstResponder" id="SUU-jm-HDm" userLabel="First Responder" sceneMemberID="firstResponder"/>
</objects>
<point key="canvasLocation" x="1710" y="-1039"/>
<point key="canvasLocation" x="-172" y="-1105"/>
</scene>
<!--Timelines View Controller-->
<scene sceneID="utN-zB-UGT">
@ -1378,7 +1577,7 @@
<objects>
<tableViewController storyboardIdentifier="StatusTableViewController" id="RAJ-ub-len" customClass="StatusTableViewController" customModule="elpha_ios" customModuleProvider="target" sceneMemberID="viewController">
<tableView key="view" clipsSubviews="YES" contentMode="scaleToFill" alwaysBounceVertical="YES" dataMode="prototypes" style="plain" separatorStyle="none" rowHeight="-1" estimatedRowHeight="-1" sectionHeaderHeight="28" sectionFooterHeight="28" id="3Kx-zr-iiy">
<rect key="frame" x="0.0" y="0.0" width="375" height="1000"/>
<rect key="frame" x="0.0" y="0.0" width="375" height="812"/>
<autoresizingMask key="autoresizingMask" widthSizable="YES" heightSizable="YES"/>
<color key="backgroundColor" white="1" alpha="1" colorSpace="custom" customColorSpace="genericGamma22GrayColorSpace"/>
<prototypes>
@ -1414,7 +1613,7 @@
<view contentMode="scaleToFill" translatesAutoresizingMaskIntoConstraints="NO" id="7I8-6E-s1Q">
<rect key="frame" x="0.0" y="60" width="375" height="90"/>
<subviews>
<imageView userInteractionEnabled="NO" contentMode="scaleToFill" horizontalHuggingPriority="251" verticalHuggingPriority="251" translatesAutoresizingMaskIntoConstraints="NO" id="LHS-vw-fZE">
<imageView clipsSubviews="YES" userInteractionEnabled="NO" contentMode="scaleToFill" horizontalHuggingPriority="251" verticalHuggingPriority="251" translatesAutoresizingMaskIntoConstraints="NO" id="LHS-vw-fZE">
<rect key="frame" x="8" y="20" width="55" height="55"/>
<constraints>
<constraint firstAttribute="width" constant="55" id="Qmn-E0-76F"/>
@ -1461,7 +1660,7 @@
<color key="textColor" name="Text"/>
<fontDescription key="fontDescription" type="system" pointSize="16"/>
<textInputTraits key="textInputTraits" autocorrectionType="no" spellCheckingType="no" smartDashesType="no" smartInsertDeleteType="no" smartQuotesType="no"/>
<dataDetectorType key="dataDetectorTypes" phoneNumber="YES" link="YES" address="YES" calendarEvent="YES" shipmentTrackingNumber="YES" flightNumber="YES" lookupSuggestion="YES"/>
<dataDetectorType key="dataDetectorTypes" link="YES"/>
</textView>
</subviews>
<color key="backgroundColor" name="Background Primary"/>
@ -1706,7 +1905,7 @@
<rect key="frame" x="0.0" y="0.0" width="375" height="120"/>
<autoresizingMask key="autoresizingMask"/>
<subviews>
<view contentMode="scaleToFill" translatesAutoresizingMaskIntoConstraints="NO" id="fRl-xT-b9t" customClass="StatusView" customModule="elpha_ios" customModuleProvider="target">
<view contentMode="scaleToFill" verticalHuggingPriority="251" translatesAutoresizingMaskIntoConstraints="NO" id="fRl-xT-b9t" customClass="StatusView" customModule="elpha_ios" customModuleProvider="target">
<rect key="frame" x="0.0" y="0.0" width="375" height="120"/>
<color key="backgroundColor" white="1" alpha="1" colorSpace="custom" customColorSpace="genericGamma22GrayColorSpace"/>
</view>
@ -1889,14 +2088,13 @@
<navigationController storyboardIdentifier="InstancesNavigationController" automaticallyAdjustsScrollViewInsets="NO" id="SqQ-GI-iCq" customClass="InstancesNavigationController" customModule="elpha_ios" customModuleProvider="target" sceneMemberID="viewController">
<toolbarItems/>
<navigationBar key="navigationBar" contentMode="scaleToFill" insetsLayoutMarginsFromSafeArea="NO" largeTitles="YES" id="QFN-sS-62X">
<rect key="frame" x="0.0" y="44" width="375" height="96"/>
<autoresizingMask key="autoresizingMask"/>
<color key="tintColor" red="0.090196078430000007" green="0.047058823530000002" blue="0.28627450980000002" alpha="1" colorSpace="custom" customColorSpace="sRGB"/>
<textAttributes key="titleTextAttributes">
<color key="textColor" red="0.090196078430000007" green="0.047058823530000002" blue="0.28627450980000002" alpha="1" colorSpace="custom" customColorSpace="sRGB"/>
<color key="textColor" red="0.32549019607843138" green="0.20392156862745098" blue="0.55686274509803924" alpha="1" colorSpace="custom" customColorSpace="sRGB"/>
</textAttributes>
<textAttributes key="largeTitleTextAttributes">
<color key="textColor" red="0.090196078430000007" green="0.047058823530000002" blue="0.28627450980000002" alpha="1" colorSpace="custom" customColorSpace="sRGB"/>
<color key="textColor" red="0.32549019607843138" green="0.20392156862745098" blue="0.55686274509803924" alpha="1" colorSpace="custom" customColorSpace="sRGB"/>
</textAttributes>
</navigationBar>
<nil name="viewControllers"/>
@ -1912,17 +2110,16 @@
<scene sceneID="7xU-Ns-Wf3">
<objects>
<navigationController automaticallyAdjustsScrollViewInsets="NO" id="lZk-Km-KQ7" sceneMemberID="viewController">
<tabBarItem key="tabBarItem" title="Account" image="Account" id="cPa-gy-q4n"/>
<tabBarItem key="tabBarItem" title="Account" image="Account" selectedImage="Account" id="cPa-gy-q4n"/>
<toolbarItems/>
<navigationBar key="navigationBar" contentMode="scaleToFill" insetsLayoutMarginsFromSafeArea="NO" largeTitles="YES" id="5mb-Wh-DRp">
<rect key="frame" x="0.0" y="44" width="375" height="96"/>
<autoresizingMask key="autoresizingMask"/>
<color key="tintColor" red="0.090196078430000007" green="0.047058823530000002" blue="0.28627450980000002" alpha="1" colorSpace="custom" customColorSpace="sRGB"/>
<textAttributes key="titleTextAttributes">
<color key="textColor" red="0.090196078430000007" green="0.047058823530000002" blue="0.28627450980000002" alpha="1" colorSpace="custom" customColorSpace="sRGB"/>
<color key="textColor" red="0.32549019607843138" green="0.20392156862745098" blue="0.55686274509803924" alpha="1" colorSpace="custom" customColorSpace="sRGB"/>
</textAttributes>
<textAttributes key="largeTitleTextAttributes">
<color key="textColor" red="0.090196078430000007" green="0.047058823530000002" blue="0.28627450980000002" alpha="1" colorSpace="custom" customColorSpace="sRGB"/>
<color key="textColor" red="0.32549019607843138" green="0.20392156862745098" blue="0.55686274509803924" alpha="1" colorSpace="custom" customColorSpace="sRGB"/>
</textAttributes>
</navigationBar>
<nil name="viewControllers"/>
@ -1942,9 +2139,10 @@
<image name="Close" width="20" height="20"/>
<image name="Close White" width="20" height="20"/>
<image name="Globe" width="22" height="22"/>
<image name="Instance Placeholder" width="135" height="135"/>
<image name="Instance Placeholder" width="60" height="60"/>
<image name="Logo" width="180" height="180"/>
<image name="Message" width="20" height="20"/>
<image name="Search" width="20" height="20"/>
<image name="Share" width="18" height="22"/>
<image name="Share White" width="18" height="22"/>
<image name="Star Regular" width="22" height="22"/>

6
elpha-ios/ComposeViewController.swift

@ -53,6 +53,8 @@ class ComposeViewController: UIViewController {
statusTextView.delegate = self
statusTextView.inputAccessoryView = composeAccessoryView
statusCharacterCountLabel.text = String(characterLimit)
NotificationCenter.default.addObserver(self, selector: #selector(keyboardNotification(notification:)), name: UIResponder.keyboardWillChangeFrameNotification, object: nil)
if let replyToStatus = replyToStatus {
@ -104,7 +106,9 @@ class ComposeViewController: UIViewController {
extension ComposeViewController: UITextViewDelegate {
func textViewDidChange(_ textView: UITextView) {
let characters = statusTextView.text!.count
statusCharacterCountLabel.text = String(characterLimit - characters)
let remainingCharacters = characterLimit - characters
statusCharacterCountLabel.text = String(remainingCharacters)
statusCharacterCountLabel.textColor = remainingCharacters < 1 ? UIColor.red : UIColor(named: "Primary")
}
}

3
elpha-ios/Elpha.xcdatamodeld/Elpha.xcdatamodel/contents

@ -104,6 +104,7 @@
<relationship name="timeline" optional="YES" maxCount="1" deletionRule="Nullify" destinationEntity="Timeline" inverseName="session" inverseEntity="Timeline" syncable="YES"/>
</entity>
<entity name="Status" representedClassName="StatusMO" syncable="YES" codeGenerationType="class">
<attribute name="attributedContent" optional="YES" attributeType="Transformable" customClassName="NSAttributedString" syncable="YES"/>
<attribute name="content" optional="YES" attributeType="String" syncable="YES"/>
<attribute name="createdAt" attributeType="Date" usesScalarValueType="NO" syncable="YES"/>
<attribute name="emojis" optional="YES" attributeType="Transformable" customClassName="[Emoji]" syncable="YES"/>
@ -161,7 +162,7 @@
<element name="ISInstance" positionX="-18" positionY="153" width="128" height="450"/>
<element name="ISLanguage" positionX="-286.21875" positionY="512.6171875" width="128" height="75"/>
<element name="Session" positionX="-445.046875" positionY="277.31640625" width="128" height="150"/>
<element name="Status" positionX="-459" positionY="216" width="128" height="495"/>
<element name="Status" positionX="-459" positionY="216" width="128" height="510"/>
<element name="Tag" positionX="-432" positionY="243" width="128" height="90"/>
<element name="Timeline" positionX="-468" positionY="207" width="128" height="150"/>
</elements>

13
elpha-ios/HashtagSearchTableViewCell.swift

@ -0,0 +1,13 @@
//
// HashtagSearchTableViewCell.swift
// elpha-ios
//
// Created by Dwayne Harris on 11/30/18.
// Copyright © 2018 Elpha. All rights reserved.
//
import UIKit
class HashtagSearchTableViewCell: UITableViewCell {
@IBOutlet var hashtagLabel: UILabel!
}

3
elpha-ios/InstancesDataManager.swift

@ -66,7 +66,6 @@ class InstancesDataManager {
func setAttributes(on instance: ISInstanceMO, with attributes: [String: Any]) {
guard let id = attributes["id"] as? String, let name = attributes["name"] as? String else {
print("Error")
return
}
@ -159,8 +158,6 @@ class InstancesDataManager {
let requestURL = "\(Config.instancesServiceURL)\(Config.instancesServiceListEndpoint)?\(params.joined(separator: "&"))"
let headers: HTTPHeaders = ["Authorization": "Bearer \(Config.instancesServiceSecret)"]
print("loading instances: requestURL: \(requestURL)")
Alamofire.request(requestURL, headers: headers).validate().responseJSON { response in
switch response.result {
case .success(let value):

1
elpha-ios/MastodonDataManager.swift

@ -299,6 +299,7 @@ public class MastodonDataManager {
status.pinned = data["pinned"] as? Bool ?? false
status.spoilerText = data["spoiler_text"] as? String
status.visibility = data["visibility"] as? String
status.attributedContent = status.content?.htmlAttributed(size: 15.0)
status.fetchedAt = Date()

147
elpha-ios/SearchTableViewController.swift

@ -0,0 +1,147 @@
//
// SearchTableViewController.swift
// elpha-ios
//
// Created by Dwayne Harris on 11/30/18.
// Copyright © 2018 Elpha. All rights reserved.
//
import Kingfisher
import UIKit
class SearchTableViewController: UITableViewController {
@IBOutlet var searchBar: UISearchBar!
@IBOutlet var searchSegmentedControl: UISegmentedControl!
@IBOutlet var noResultsView: UIView!
var accounts: [AccountMO]?
var hashtags: [TagMO]?
var statuses: [StatusMO]?
func clearResults() {
self.accounts = []
self.hashtags = []
self.accounts = []
tableView.reloadData()
}
override func viewDidLoad() {
super.viewDidLoad()
tableView.backgroundView = noResultsView
searchBar.delegate = self
}
@IBAction func searchSegmentedControlTapped(_ sender: Any) {
tableView.reloadData()
if tableView.numberOfRows(inSection: 0) == 0 {
tableView.backgroundView = noResultsView
} else {
tableView.backgroundView = nil
}
}
override func numberOfSections(in tableView: UITableView) -> Int {
return 1
}
override func tableView(_ tableView: UITableView, numberOfRowsInSection section: Int) -> Int {
switch searchSegmentedControl.selectedSegmentIndex {
case 0: return accounts?.count ?? 0
case 1: return hashtags?.count ?? 0
case 2: return statuses?.count ?? 0
default: return 0
}
}
override func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell {
switch searchSegmentedControl.selectedSegmentIndex {
case 0:
guard let cell = tableView.dequeueReusableCell(withIdentifier: "AccountSearchTableViewCell", for: indexPath) as? AccountSearchTableViewCell else {
fatalError("Unable to find reusable cell")
}
if let account = self.accounts?[indexPath.row] {
cell.avatarImageView.setRoundedCorners()
cell.avatarImageView.kf.setImage(with: account.avatarURL)
cell.displayNameLabel.text = account.displayName
cell.usernameLabel.text = "@\(account.acct!)"
}
return cell
case 1:
guard let cell = tableView.dequeueReusableCell(withIdentifier: "HashtagSearchTableViewCell", for: indexPath) as? HashtagSearchTableViewCell else {
fatalError("Unable to find reusable cell")
}
if let hashtag = self.hashtags?[indexPath.row] {
cell.hashtagLabel.text = "#\(hashtag.name!)"
}
return cell
case 2:
guard let cell = tableView.dequeueReusableCell(withIdentifier: "StatusSearchTableViewCell", for: indexPath) as? StatusSearchTableViewCell else {
fatalError("Unable to find reusable cell")
}
if let status = self.statuses?[indexPath.row] {
cell.statusView.update(withStatus: status)
}
return cell
default:
fatalError("")
}
}
override func tableView(_ tableView: UITableView, didSelectRowAt indexPath: IndexPath) {
switch searchSegmentedControl.selectedSegmentIndex {
case 0:
if let account = self.accounts?[indexPath.row] {
if let controller = UIStoryboard(name: "Main", bundle: nil).instantiateViewController(withIdentifier: "AccountTableViewController") as? AccountTableViewController {
controller.account = account
self.navigationController?.pushViewController(controller, animated: true)
}
}
default:
return
}
}
}
extension SearchTableViewController: UISearchBarDelegate {
func searchBarSearchButtonClicked(_ searchBar: UISearchBar) {
if let search = searchBar.text, !search.isEmpty {
searchBar.resignFirstResponder()
MastodonAPI.search(content: search) { data, error in
guard let data = data, error == nil else {
return
}
if let accounts = data["accounts"] as? JSONObjectArray {
self.accounts = accounts.compactMap { MastodonDataManager.upsertAccount($0) }
}
if let hashtags = data["hashtags"] as? JSONObjectArray {
self.hashtags = hashtags.compactMap { MastodonDataManager.upsertTag($0) }
}
if let statuses = data["statuses"] as? JSONObjectArray {
self.statuses = statuses.compactMap { MastodonDataManager.upsertStatus($0) }.map { $0.object }
}
self.tableView.reloadData()
}
} else {
clearResults()
searchBar.resignFirstResponder()
}
}
func searchBarCancelButtonClicked(_ searchBar: UISearchBar) {
clearResults()
}
}

13
elpha-ios/StatusSearchTableViewCell.swift

@ -0,0 +1,13 @@
//
// StatusSearchTableViewCell.swift
// elpha-ios
//
// Created by Dwayne Harris on 11/30/18.
// Copyright © 2018 Elpha. All rights reserved.
//
import UIKit
class StatusSearchTableViewCell: UITableViewCell {
@IBOutlet var statusView: StatusView!
}

24
elpha-ios/StatusTableViewController.swift

@ -341,19 +341,19 @@ extension StatusTableViewController {
return 1
}
override func tableView(_ tableView: UITableView, willDisplay cell: UITableViewCell, forRowAt indexPath: IndexPath) {
if let cell = cell as? StatusTableViewCell {
CellHeightManager.set(status: cell.statusView.status, height: cell.frame.size.height)
}
}
// override func tableView(_ tableView: UITableView, willDisplay cell: UITableViewCell, forRowAt indexPath: IndexPath) {
// if let cell = cell as? StatusTableViewCell {
// CellHeightManager.set(status: cell.statusView.status, height: cell.frame.size.height)
// }
// }
override func tableView(_ tableView: UITableView, estimatedHeightForRowAt indexPath: IndexPath) -> CGFloat {
guard let status = fetchedResultsController?.object(at: indexPath), status != self.status else {
return UITableView.automaticDimension
}
return CellHeightManager.get(status: status)
}
// override func tableView(_ tableView: UITableView, estimatedHeightForRowAt indexPath: IndexPath) -> CGFloat {
// guard let status = fetchedResultsController?.object(at: indexPath), status != self.status else {
// return UITableView.automaticDimension
// }
//
// return CellHeightManager.get(status: status)
// }
override func tableView(_ tableView: UITableView, numberOfRowsInSection section: Int) -> Int {
return fetchedResultsController?.fetchedObjects?.count ?? 0

10
elpha-ios/StatusView.swift

@ -249,15 +249,15 @@ class StatusView: UIView {
}
if let attachments = status.attachments, attachments.count > 0 {
attachmentsView.isHidden = false
attachmentsView.update(withAttachments: attachments.array as! [AttachmentMO])
UIView.performWithoutAnimation {
attachmentsView.isHidden = false
attachmentsView.update(withAttachments: attachments.array as! [AttachmentMO])
}
} else {
attachmentsView.isHidden = true
}
if let content = status.content {
contentTextView.attributedText = content.htmlAttributed(size: 15.0)
}
contentTextView.attributedText = status.attributedContent
if statusCellHidden {
if spoilerView == nil {

6
elpha-ios/StatusView.xib

@ -267,7 +267,7 @@
<outletCollection property="gestureRecognizers" destination="13W-G2-Xm4" appends="YES" id="6RI-ff-czd"/>
</connections>
</view>
<textView clipsSubviews="YES" multipleTouchEnabled="YES" contentMode="scaleToFill" scrollEnabled="NO" editable="NO" text="Content" textAlignment="natural" translatesAutoresizingMaskIntoConstraints="NO" id="o7b-at-xQ9" customClass="UITextViewFixed" customModule="elpha_ios" customModuleProvider="target">
<textView clipsSubviews="YES" multipleTouchEnabled="YES" contentMode="scaleToFill" verticalCompressionResistancePriority="755" scrollEnabled="NO" editable="NO" text="Content" textAlignment="natural" translatesAutoresizingMaskIntoConstraints="NO" id="o7b-at-xQ9" customClass="UITextViewFixed" customModule="elpha_ios" customModuleProvider="target">
<rect key="frame" x="8" y="86" width="359" height="22"/>
<color key="backgroundColor" white="1" alpha="1" colorSpace="custom" customColorSpace="genericGamma22GrayColorSpace"/>
<color key="tintColor" name="Primary"/>
@ -275,7 +275,7 @@
<color key="textColor" name="Text"/>
<fontDescription key="fontDescription" type="system" pointSize="16"/>
<textInputTraits key="textInputTraits" autocorrectionType="no" spellCheckingType="no" smartDashesType="no" smartInsertDeleteType="no" smartQuotesType="no"/>
<dataDetectorType key="dataDetectorTypes" phoneNumber="YES" link="YES" address="YES" calendarEvent="YES" shipmentTrackingNumber="YES" flightNumber="YES" lookupSuggestion="YES"/>
<dataDetectorType key="dataDetectorTypes" link="YES"/>
<connections>
<outletCollection property="gestureRecognizers" destination="NIR-5D-8DX" appends="YES" id="mbF-iG-qgu"/>
</connections>
@ -296,7 +296,7 @@
<outletCollection property="gestureRecognizers" destination="9fc-Py-yTV" appends="YES" id="nDQ-45-6W2"/>
</connections>
</view>
<view contentMode="scaleToFill" translatesAutoresizingMaskIntoConstraints="NO" id="XuS-iF-YYL" customClass="AttachmentsView" customModule="elpha_ios" customModuleProvider="target">
<view contentMode="scaleToFill" verticalHuggingPriority="251" translatesAutoresizingMaskIntoConstraints="NO" id="XuS-iF-YYL" customClass="AttachmentsView" customModule="elpha_ios" customModuleProvider="target">
<rect key="frame" x="0.0" y="371" width="375" height="375"/>
<constraints>
<constraint firstAttribute="width" secondItem="XuS-iF-YYL" secondAttribute="height" multiplier="1:1" priority="999" id="8CQ-GM-Un6"/>

45
elpha-ios/TimelineTableViewController.swift

@ -81,6 +81,7 @@ class TimelineTableViewController: AbstractStatusTableViewController {
NotificationCenter.default.addObserver(self, selector: #selector(onDidAuthenticate), name: .didAuthenticate, object: nil)
NotificationCenter.default.addObserver(self, selector: #selector(onDidUnauthenticate), name: .didUnauthenticate, object: nil)
NotificationCenter.default.addObserver(self, selector: #selector(onDidBecomeActive), name: .didBecomeActive, object: nil)
}
override func viewDidAppear(_ animated: Bool) {
@ -92,20 +93,22 @@ class TimelineTableViewController: AbstractStatusTableViewController {
}
override func loadMoreTapped(_ sender: Any, status: StatusMO, direction: PaginationDirection) {
func removeMarker(at: Int) {
status.markers?.remove(at: at)
CoreDataManager.shared.saveContext()
}
var markerIndex = -1
if let markers = status.markers {
for (index, marker) in markers.enumerated() {
if marker.context == self.currentPaginationContext && marker.item.direction == direction {
fetchTimeline(withPagination: marker.item) { error in
if error == nil {
removeMarker(at: index)
} else {
AlertManager.shared.show(message: error!.localizedDescription, category: .error)
}
markerIndex = index
}
}
if markerIndex > -1 {
status.markers?.remove(at: markerIndex)
CoreDataManager.shared.saveContext()
fetchTimeline(withPagination: markers[markerIndex].item) { error in
if error != nil {
AlertManager.shared.show(message: error!.localizedDescription, category: .error)
}
}
}
@ -142,6 +145,12 @@ class TimelineTableViewController: AbstractStatusTableViewController {
performSegue(withIdentifier: "AuthenticateSegue", sender: self)
}
@objc func onDidBecomeActive() {
if SettingsManager.automaticallyRefreshTimelines {
fetch()
}
}
override func prepare(for segue: UIStoryboardSegue, sender: Any?) {
if segue.identifier == "TimelinesSegue" {
if let destination = segue.destination as? TimelinesViewController {
@ -375,15 +384,15 @@ extension TimelineTableViewController {
return fetchedResultsController?.fetchedObjects?.count ?? 0
}
override func tableView(_ tableView: UITableView, willDisplay cell: UITableViewCell, forRowAt indexPath: IndexPath) {
if let cell = cell as? TimelineTableViewCell {
CellHeightManager.set(status: cell.statusView.status, height: cell.frame.size.height)
}
}
// override func tableView(_ tableView: UITableView, willDisplay cell: UITableViewCell, forRowAt indexPath: IndexPath) {
// if let cell = cell as? TimelineTableViewCell {
// CellHeightManager.set(status: cell.statusView.status, height: cell.frame.size.height)
// }
// }
override func tableView(_ tableView: UITableView, estimatedHeightForRowAt indexPath: IndexPath) -> CGFloat {
return CellHeightManager.get(status: fetchedResultsController?.object(at: indexPath))
}
// override func tableView(_ tableView: UITableView, estimatedHeightForRowAt indexPath: IndexPath) -> CGFloat {
// return CellHeightManager.get(status: fetchedResultsController?.object(at: indexPath))
// }
override func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell {
guard let cell = tableView.dequeueReusableCell(withIdentifier: "TimelineTableViewCell", for: indexPath) as? TimelineTableViewCell else {

4
elpha-ios/TimelinesViewController.swift

@ -129,9 +129,7 @@ extension TimelinesViewController: UITableViewDataSource, UITableViewDelegate {
fatalError("CoreData error")
}
if let delegate = self.delegate {
delegate.didSelect(self, timeline: timeline)
}
delegate?.didSelect(self, timeline: timeline)
dismiss(animated: true)
}

Loading…
Cancel
Save