bookmark Collection view

This commit is contained in:
Chris Li 2017-01-17 13:11:53 -05:00
parent bb58f40e9b
commit c0443cd506
6 changed files with 70 additions and 18 deletions

View File

@ -0,0 +1,21 @@
{
"images" : [
{
"idiom" : "universal",
"scale" : "1x"
},
{
"idiom" : "universal",
"scale" : "2x"
},
{
"idiom" : "universal",
"filename" : "more-2.png",
"scale" : "3x"
}
],
"info" : {
"version" : 1,
"author" : "xcode"
}
}

Binary file not shown.

After

Width:  |  Height:  |  Size: 479 B

View File

@ -32,6 +32,13 @@ class BookmarkCollectionController: UIViewController, UICollectionViewDataSource
} }
} }
let dateFormatter: DateFormatter = {
let formatter = DateFormatter()
formatter.dateStyle = .medium
formatter.timeStyle = .short
return formatter
}()
@IBAction func dismiss(_ sender: UIBarButtonItem) { @IBAction func dismiss(_ sender: UIBarButtonItem) {
dismiss(animated: true, completion: nil) dismiss(animated: true, completion: nil)
} }
@ -80,6 +87,8 @@ class BookmarkCollectionController: UIViewController, UICollectionViewDataSource
if let data = article.thumbImageData { if let data = article.thumbImageData {
cell.thumbImageView.image = UIImage(data: data) cell.thumbImageView.image = UIImage(data: data)
} }
cell.bookTitleLabel.text = article.book?.title
if let date = article.bookmarkDate {cell.bookmarkDetailLabel.text = dateFormatter.string(from: date)}
return cell return cell
} }
@ -104,8 +113,7 @@ class BookmarkCollectionController: UIViewController, UICollectionViewDataSource
let managedObjectContext = AppDelegate.persistentContainer.viewContext let managedObjectContext = AppDelegate.persistentContainer.viewContext
lazy var fetchedResultController: NSFetchedResultsController<Article> = { lazy var fetchedResultController: NSFetchedResultsController<Article> = {
let fetchRequest = Article.fetchRequest() let fetchRequest = Article.fetchRequest()
let titleDescriptor = NSSortDescriptor(key: "title", ascending: true) fetchRequest.sortDescriptors = [NSSortDescriptor(key: "bookmarkDate", ascending: false)]
fetchRequest.sortDescriptors = [titleDescriptor]
var predicates = [NSPredicate]() var predicates = [NSPredicate]()
predicates.append(NSPredicate(format: "isBookmarked = true")) predicates.append(NSPredicate(format: "isBookmarked = true"))
if let book = self.book { predicates.append(NSPredicate(format: "book == %@", book)) } if let book = self.book { predicates.append(NSPredicate(format: "book == %@", book)) }

View File

@ -203,6 +203,7 @@ extension MainController: ButtonDelegates {
guard let url = webView.request?.url, guard let url = webView.request?.url,
let article = Article.fetch(url: url, context: context) else {return} let article = Article.fetch(url: url, context: context) else {return}
article.isBookmarked = !article.isBookmarked article.isBookmarked = !article.isBookmarked
if article.isBookmarked {article.bookmarkDate = Date()}
if context.hasChanges {try? context.save()} if context.hasChanges {try? context.save()}

View File

@ -48,60 +48,75 @@
<constraint firstAttribute="width" constant="32" id="aFo-L8-O71"/> <constraint firstAttribute="width" constant="32" id="aFo-L8-O71"/>
</constraints> </constraints>
</imageView> </imageView>
<label opaque="NO" userInteractionEnabled="NO" contentMode="left" horizontalHuggingPriority="251" verticalHuggingPriority="251" text="Label" textAlignment="justified" lineBreakMode="wordWrap" numberOfLines="0" baselineAdjustment="alignBaselines" adjustsFontSizeToFit="NO" translatesAutoresizingMaskIntoConstraints="NO" id="LK0-aY-C9L"> <label opaque="NO" userInteractionEnabled="NO" contentMode="left" horizontalHuggingPriority="251" verticalHuggingPriority="251" text="Label" textAlignment="justified" lineBreakMode="wordWrap" numberOfLines="0" baselineAdjustment="alignBaselines" adjustsLetterSpacingToFitWidth="YES" adjustsFontSizeToFit="NO" translatesAutoresizingMaskIntoConstraints="NO" id="LK0-aY-C9L">
<rect key="frame" x="8" y="29" width="191" height="17"/> <rect key="frame" x="8" y="31" width="191" height="17"/>
<fontDescription key="fontDescription" type="system" pointSize="14"/> <fontDescription key="fontDescription" type="system" pointSize="14"/>
<nil key="textColor"/> <nil key="textColor"/>
<nil key="highlightedColor"/> <nil key="highlightedColor"/>
</label> </label>
<label opaque="NO" userInteractionEnabled="NO" contentMode="left" horizontalHuggingPriority="251" verticalHuggingPriority="251" text="Label" textAlignment="center" lineBreakMode="tailTruncation" baselineAdjustment="alignBaselines" adjustsLetterSpacingToFitWidth="YES" adjustsFontSizeToFit="NO" translatesAutoresizingMaskIntoConstraints="NO" id="YA4-yb-hoI"> <label opaque="NO" userInteractionEnabled="NO" contentMode="left" horizontalHuggingPriority="251" verticalHuggingPriority="251" text="Label" textAlignment="center" lineBreakMode="tailTruncation" baselineAdjustment="alignBaselines" adjustsLetterSpacingToFitWidth="YES" adjustsFontSizeToFit="NO" translatesAutoresizingMaskIntoConstraints="NO" id="YA4-yb-hoI">
<rect key="frame" x="8" y="8" width="191" height="21"/> <rect key="frame" x="8" y="9" width="191" height="21"/>
<constraints> <constraints>
<constraint firstAttribute="height" constant="21" id="ryf-C9-VVi"/> <constraint firstAttribute="height" constant="21" id="ryf-C9-VVi"/>
</constraints> </constraints>
<fontDescription key="fontDescription" type="system" pointSize="17"/> <fontDescription key="fontDescription" type="system" weight="medium" pointSize="16"/>
<nil key="textColor"/> <nil key="textColor"/>
<nil key="highlightedColor"/> <nil key="highlightedColor"/>
</label> </label>
<view contentMode="scaleToFill" translatesAutoresizingMaskIntoConstraints="NO" id="9EM-Do-qfE"> <view contentMode="scaleToFill" translatesAutoresizingMaskIntoConstraints="NO" id="9EM-Do-qfE">
<rect key="frame" x="8" y="123" width="191" height="2"/> <rect key="frame" x="8" y="121" width="191" height="2"/>
<color key="backgroundColor" white="0.66666666666666663" alpha="1" colorSpace="calibratedWhite"/> <color key="backgroundColor" white="0.66666666666666663" alpha="1" colorSpace="calibratedWhite"/>
<constraints> <constraints>
<constraint firstAttribute="height" constant="2" id="y4a-qe-lIJ"/> <constraint firstAttribute="height" constant="2" id="y4a-qe-lIJ"/>
</constraints> </constraints>
</view> </view>
<label opaque="NO" userInteractionEnabled="NO" contentMode="left" horizontalHuggingPriority="251" verticalHuggingPriority="251" text="Label" textAlignment="natural" lineBreakMode="tailTruncation" baselineAdjustment="alignBaselines" adjustsFontSizeToFit="NO" translatesAutoresizingMaskIntoConstraints="NO" id="Alw-Di-WEl"> <label opaque="NO" userInteractionEnabled="NO" contentMode="left" horizontalHuggingPriority="251" verticalHuggingPriority="251" text="Label" textAlignment="natural" lineBreakMode="tailTruncation" baselineAdjustment="alignBaselines" adjustsFontSizeToFit="NO" translatesAutoresizingMaskIntoConstraints="NO" id="Alw-Di-WEl">
<rect key="frame" x="48" y="126.99999999999999" width="31" height="14.666666666666643"/> <rect key="frame" x="47.999999999999993" y="129" width="35.333333333333321" height="17"/>
<fontDescription key="fontDescription" type="system" pointSize="14"/>
<nil key="textColor"/>
<nil key="highlightedColor"/>
</label>
<button opaque="NO" contentMode="scaleToFill" contentHorizontalAlignment="center" contentVerticalAlignment="center" lineBreakMode="middleTruncation" translatesAutoresizingMaskIntoConstraints="NO" id="HLG-V7-emv">
<rect key="frame" x="173" y="132" width="26" height="26"/>
<constraints>
<constraint firstAttribute="height" constant="26" id="gg4-Gh-ifO"/>
<constraint firstAttribute="width" constant="26" id="iHJ-xq-kia"/>
</constraints>
<state key="normal" image="Dots"/>
</button>
<label opaque="NO" userInteractionEnabled="NO" contentMode="left" horizontalHuggingPriority="251" verticalHuggingPriority="251" text="Label" textAlignment="natural" lineBreakMode="tailTruncation" baselineAdjustment="alignBaselines" adjustsFontSizeToFit="NO" translatesAutoresizingMaskIntoConstraints="NO" id="IJ9-eG-Llq">
<rect key="frame" x="48" y="146.66666666666663" width="31" height="14.333333333333343"/>
<fontDescription key="fontDescription" type="system" pointSize="12"/> <fontDescription key="fontDescription" type="system" pointSize="12"/>
<nil key="textColor"/> <nil key="textColor"/>
<nil key="highlightedColor"/> <nil key="highlightedColor"/>
</label> </label>
<button opaque="NO" contentMode="scaleToFill" contentHorizontalAlignment="center" contentVerticalAlignment="center" buttonType="roundedRect" lineBreakMode="middleTruncation" translatesAutoresizingMaskIntoConstraints="NO" id="HLG-V7-emv">
<rect key="frame" x="153" y="131" width="46" height="30"/>
<state key="normal" title="Button"/>
</button>
</subviews> </subviews>
</view> </view>
<color key="backgroundColor" white="1" alpha="1" colorSpace="calibratedWhite"/> <color key="backgroundColor" white="1" alpha="1" colorSpace="calibratedWhite"/>
<constraints> <constraints>
<constraint firstAttribute="trailingMargin" secondItem="9EM-Do-qfE" secondAttribute="trailing" id="0H3-5k-m0f"/> <constraint firstAttribute="trailingMargin" secondItem="9EM-Do-qfE" secondAttribute="trailing" id="0H3-5k-m0f"/>
<constraint firstItem="LK0-aY-C9L" firstAttribute="top" secondItem="YA4-yb-hoI" secondAttribute="bottom" id="95I-Gx-tc1"/> <constraint firstItem="LK0-aY-C9L" firstAttribute="top" secondItem="YA4-yb-hoI" secondAttribute="bottom" constant="1" id="95I-Gx-tc1"/>
<constraint firstItem="CQi-0M-O0e" firstAttribute="top" secondItem="9EM-Do-qfE" secondAttribute="bottom" constant="4" id="9jg-Ou-dzI"/> <constraint firstItem="CQi-0M-O0e" firstAttribute="top" secondItem="9EM-Do-qfE" secondAttribute="bottom" constant="6" id="9jg-Ou-dzI"/>
<constraint firstItem="Alw-Di-WEl" firstAttribute="leading" secondItem="CQi-0M-O0e" secondAttribute="trailing" constant="8" id="Eoq-GI-7la"/> <constraint firstItem="Alw-Di-WEl" firstAttribute="leading" secondItem="CQi-0M-O0e" secondAttribute="trailing" constant="8" id="Eoq-GI-7la"/>
<constraint firstItem="Alw-Di-WEl" firstAttribute="top" secondItem="9EM-Do-qfE" secondAttribute="bottom" constant="2" id="GkX-zd-iqc"/> <constraint firstItem="Alw-Di-WEl" firstAttribute="top" secondItem="9EM-Do-qfE" secondAttribute="bottom" constant="6" id="GkX-zd-iqc"/>
<constraint firstItem="9EM-Do-qfE" firstAttribute="top" relation="greaterThanOrEqual" secondItem="LK0-aY-C9L" secondAttribute="bottom" constant="4" id="Hju-Lg-iT1"/> <constraint firstItem="9EM-Do-qfE" firstAttribute="top" relation="greaterThanOrEqual" secondItem="LK0-aY-C9L" secondAttribute="bottom" constant="4" id="Hju-Lg-iT1"/>
<constraint firstItem="YA4-yb-hoI" firstAttribute="top" secondItem="lfi-9s-ZjZ" secondAttribute="topMargin" id="MCl-Il-92w"/> <constraint firstItem="YA4-yb-hoI" firstAttribute="top" secondItem="lfi-9s-ZjZ" secondAttribute="topMargin" constant="1" id="MCl-Il-92w"/>
<constraint firstAttribute="bottomMargin" secondItem="HLG-V7-emv" secondAttribute="bottom" id="MLR-CH-oRZ"/>
<constraint firstItem="LK0-aY-C9L" firstAttribute="trailing" secondItem="lfi-9s-ZjZ" secondAttribute="trailingMargin" id="Uyi-Wf-Cnt"/> <constraint firstItem="LK0-aY-C9L" firstAttribute="trailing" secondItem="lfi-9s-ZjZ" secondAttribute="trailingMargin" id="Uyi-Wf-Cnt"/>
<constraint firstAttribute="leadingMargin" secondItem="CQi-0M-O0e" secondAttribute="leading" id="ZX6-PL-WbD"/> <constraint firstAttribute="leadingMargin" secondItem="CQi-0M-O0e" secondAttribute="leading" id="ZX6-PL-WbD"/>
<constraint firstAttribute="bottomMargin" secondItem="IJ9-eG-Llq" secondAttribute="bottom" id="cF2-DE-1ML"/>
<constraint firstItem="YA4-yb-hoI" firstAttribute="trailing" secondItem="lfi-9s-ZjZ" secondAttribute="trailingMargin" id="hLA-Zn-QPh"/> <constraint firstItem="YA4-yb-hoI" firstAttribute="trailing" secondItem="lfi-9s-ZjZ" secondAttribute="trailingMargin" id="hLA-Zn-QPh"/>
<constraint firstItem="HLG-V7-emv" firstAttribute="centerY" secondItem="CQi-0M-O0e" secondAttribute="centerY" id="jfS-zk-Zag"/>
<constraint firstAttribute="trailingMargin" secondItem="HLG-V7-emv" secondAttribute="trailing" id="lIe-ot-ssw"/> <constraint firstAttribute="trailingMargin" secondItem="HLG-V7-emv" secondAttribute="trailing" id="lIe-ot-ssw"/>
<constraint firstItem="YA4-yb-hoI" firstAttribute="leading" secondItem="lfi-9s-ZjZ" secondAttribute="leadingMargin" id="rW4-0u-SSB"/> <constraint firstItem="YA4-yb-hoI" firstAttribute="leading" secondItem="lfi-9s-ZjZ" secondAttribute="leadingMargin" id="rW4-0u-SSB"/>
<constraint firstItem="IJ9-eG-Llq" firstAttribute="leading" secondItem="CQi-0M-O0e" secondAttribute="trailing" constant="8" id="tyS-4B-ZFF"/>
<constraint firstAttribute="bottomMargin" secondItem="CQi-0M-O0e" secondAttribute="bottom" id="v5E-tX-8bf"/> <constraint firstAttribute="bottomMargin" secondItem="CQi-0M-O0e" secondAttribute="bottom" id="v5E-tX-8bf"/>
<constraint firstAttribute="leadingMargin" secondItem="9EM-Do-qfE" secondAttribute="leading" id="wFD-yH-9vp"/> <constraint firstAttribute="leadingMargin" secondItem="9EM-Do-qfE" secondAttribute="leading" id="wFD-yH-9vp"/>
<constraint firstItem="LK0-aY-C9L" firstAttribute="leading" secondItem="lfi-9s-ZjZ" secondAttribute="leadingMargin" id="zBD-zk-mO8"/> <constraint firstItem="LK0-aY-C9L" firstAttribute="leading" secondItem="lfi-9s-ZjZ" secondAttribute="leadingMargin" id="zBD-zk-mO8"/>
</constraints> </constraints>
<connections> <connections>
<outlet property="bookTitleLabel" destination="Alw-Di-WEl" id="IeT-eI-4at"/>
<outlet property="bookmarkDetailLabel" destination="IJ9-eG-Llq" id="yXc-Vr-xqQ"/>
<outlet property="dividerView" destination="9EM-Do-qfE" id="2Wy-se-oIO"/>
<outlet property="snippetLabel" destination="LK0-aY-C9L" id="kSC-vs-kOX"/> <outlet property="snippetLabel" destination="LK0-aY-C9L" id="kSC-vs-kOX"/>
<outlet property="thumbImageView" destination="CQi-0M-O0e" id="CRV-Dt-GUf"/> <outlet property="thumbImageView" destination="CQi-0M-O0e" id="CRV-Dt-GUf"/>
<outlet property="titleLabel" destination="YA4-yb-hoI" id="aHl-Zv-pdt"/> <outlet property="titleLabel" destination="YA4-yb-hoI" id="aHl-Zv-pdt"/>
@ -140,7 +155,7 @@
</viewController> </viewController>
<placeholder placeholderIdentifier="IBFirstResponder" id="OOK-WC-dk5" userLabel="First Responder" sceneMemberID="firstResponder"/> <placeholder placeholderIdentifier="IBFirstResponder" id="OOK-WC-dk5" userLabel="First Responder" sceneMemberID="firstResponder"/>
</objects> </objects>
<point key="canvasLocation" x="5006" y="3267"/> <point key="canvasLocation" x="5005.7971014492759" y="3266.576086956522"/>
</scene> </scene>
<!--Bookmark Article Controller--> <!--Bookmark Article Controller-->
<scene sceneID="VN9-Ad-dWZ"> <scene sceneID="VN9-Ad-dWZ">
@ -502,6 +517,7 @@
<image name="BookmarkAdded" width="348" height="331"/> <image name="BookmarkAdded" width="348" height="331"/>
<image name="BookmarkRemoved" width="348" height="331"/> <image name="BookmarkRemoved" width="348" height="331"/>
<image name="Cross" width="16" height="16"/> <image name="Cross" width="16" height="16"/>
<image name="Dots" width="21" height="21"/>
</resources> </resources>
<inferredMetricsTieBreakers> <inferredMetricsTieBreakers>
<segue reference="ipW-qc-ph3"/> <segue reference="ipW-qc-ph3"/>

View File

@ -120,6 +120,9 @@ class BookmarkCollectionCell: UICollectionViewCell {
thumbImageView.layer.cornerRadius = 4.0 thumbImageView.layer.cornerRadius = 4.0
thumbImageView.clipsToBounds = true thumbImageView.clipsToBounds = true
dividerView.layer.cornerRadius = 1
dividerView.layer.masksToBounds = true
} }
override func layoutSubviews() { override func layoutSubviews() {
@ -130,6 +133,9 @@ class BookmarkCollectionCell: UICollectionViewCell {
@IBOutlet weak var thumbImageView: UIImageView! @IBOutlet weak var thumbImageView: UIImageView!
@IBOutlet weak var titleLabel: UILabel! @IBOutlet weak var titleLabel: UILabel!
@IBOutlet weak var snippetLabel: UILabel! @IBOutlet weak var snippetLabel: UILabel!
@IBOutlet weak var dividerView: UIView!
@IBOutlet weak var bookTitleLabel: UILabel!
@IBOutlet weak var bookmarkDetailLabel: UILabel!
} }