mirror of
https://github.com/SideStore/SideStore.git
synced 2026-02-22 05:03:26 +01:00
[AltStore] Refactors BrowseViewController screenshot size logic
This commit is contained in:
@@ -169,6 +169,7 @@
|
|||||||
BFD52C2222A1A9EC000B7ED1 /* cnary.c in Sources */ = {isa = PBXBuildFile; fileRef = BFD52C1F22A1A9EC000B7ED1 /* cnary.c */; };
|
BFD52C2222A1A9EC000B7ED1 /* cnary.c in Sources */ = {isa = PBXBuildFile; fileRef = BFD52C1F22A1A9EC000B7ED1 /* cnary.c */; };
|
||||||
BFD6B03322DFF20800B86064 /* MyAppsComponents.swift in Sources */ = {isa = PBXBuildFile; fileRef = BFD6B03222DFF20800B86064 /* MyAppsComponents.swift */; };
|
BFD6B03322DFF20800B86064 /* MyAppsComponents.swift in Sources */ = {isa = PBXBuildFile; fileRef = BFD6B03222DFF20800B86064 /* MyAppsComponents.swift */; };
|
||||||
BFDB5B1622EE90D300F74113 /* Date+RelativeDate.swift in Sources */ = {isa = PBXBuildFile; fileRef = BFDB5B1522EE90D300F74113 /* Date+RelativeDate.swift */; };
|
BFDB5B1622EE90D300F74113 /* Date+RelativeDate.swift in Sources */ = {isa = PBXBuildFile; fileRef = BFDB5B1522EE90D300F74113 /* Date+RelativeDate.swift */; };
|
||||||
|
BFDB5B2622EFBBEA00F74113 /* BrowseCollectionViewCell.xib in Resources */ = {isa = PBXBuildFile; fileRef = BFDB5B2522EFBBEA00F74113 /* BrowseCollectionViewCell.xib */; };
|
||||||
BFDB69FD22A9A7B7007EA6D6 /* AccountViewController.swift in Sources */ = {isa = PBXBuildFile; fileRef = BFDB69FC22A9A7B7007EA6D6 /* AccountViewController.swift */; };
|
BFDB69FD22A9A7B7007EA6D6 /* AccountViewController.swift in Sources */ = {isa = PBXBuildFile; fileRef = BFDB69FC22A9A7B7007EA6D6 /* AccountViewController.swift */; };
|
||||||
BFDB6A0522A9AFB2007EA6D6 /* Fetchable.swift in Sources */ = {isa = PBXBuildFile; fileRef = BFDB6A0422A9AFB2007EA6D6 /* Fetchable.swift */; };
|
BFDB6A0522A9AFB2007EA6D6 /* Fetchable.swift in Sources */ = {isa = PBXBuildFile; fileRef = BFDB6A0422A9AFB2007EA6D6 /* Fetchable.swift */; };
|
||||||
BFDB6A0822AAED73007EA6D6 /* ResignAppOperation.swift in Sources */ = {isa = PBXBuildFile; fileRef = BFDB6A0722AAED73007EA6D6 /* ResignAppOperation.swift */; };
|
BFDB6A0822AAED73007EA6D6 /* ResignAppOperation.swift in Sources */ = {isa = PBXBuildFile; fileRef = BFDB6A0722AAED73007EA6D6 /* ResignAppOperation.swift */; };
|
||||||
@@ -418,6 +419,7 @@
|
|||||||
BFD52C1F22A1A9EC000B7ED1 /* cnary.c */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.c; name = cnary.c; path = Dependencies/libplist/libcnary/cnary.c; sourceTree = SOURCE_ROOT; };
|
BFD52C1F22A1A9EC000B7ED1 /* cnary.c */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.c; name = cnary.c; path = Dependencies/libplist/libcnary/cnary.c; sourceTree = SOURCE_ROOT; };
|
||||||
BFD6B03222DFF20800B86064 /* MyAppsComponents.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = MyAppsComponents.swift; sourceTree = "<group>"; };
|
BFD6B03222DFF20800B86064 /* MyAppsComponents.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = MyAppsComponents.swift; sourceTree = "<group>"; };
|
||||||
BFDB5B1522EE90D300F74113 /* Date+RelativeDate.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = "Date+RelativeDate.swift"; sourceTree = "<group>"; };
|
BFDB5B1522EE90D300F74113 /* Date+RelativeDate.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = "Date+RelativeDate.swift"; sourceTree = "<group>"; };
|
||||||
|
BFDB5B2522EFBBEA00F74113 /* BrowseCollectionViewCell.xib */ = {isa = PBXFileReference; lastKnownFileType = file.xib; path = BrowseCollectionViewCell.xib; sourceTree = "<group>"; };
|
||||||
BFDB69FC22A9A7B7007EA6D6 /* AccountViewController.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = AccountViewController.swift; sourceTree = "<group>"; };
|
BFDB69FC22A9A7B7007EA6D6 /* AccountViewController.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = AccountViewController.swift; sourceTree = "<group>"; };
|
||||||
BFDB6A0422A9AFB2007EA6D6 /* Fetchable.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = Fetchable.swift; sourceTree = "<group>"; };
|
BFDB6A0422A9AFB2007EA6D6 /* Fetchable.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = Fetchable.swift; sourceTree = "<group>"; };
|
||||||
BFDB6A0722AAED73007EA6D6 /* ResignAppOperation.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = ResignAppOperation.swift; sourceTree = "<group>"; };
|
BFDB6A0722AAED73007EA6D6 /* ResignAppOperation.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = ResignAppOperation.swift; sourceTree = "<group>"; };
|
||||||
@@ -703,6 +705,7 @@
|
|||||||
children = (
|
children = (
|
||||||
BF9ABA4422DCFF43008935CF /* BrowseViewController.swift */,
|
BF9ABA4422DCFF43008935CF /* BrowseViewController.swift */,
|
||||||
BF9ABA4622DD0638008935CF /* BrowseCollectionViewCell.swift */,
|
BF9ABA4622DD0638008935CF /* BrowseCollectionViewCell.swift */,
|
||||||
|
BFDB5B2522EFBBEA00F74113 /* BrowseCollectionViewCell.xib */,
|
||||||
BF9ABA4822DD0742008935CF /* ScreenshotCollectionViewCell.swift */,
|
BF9ABA4822DD0742008935CF /* ScreenshotCollectionViewCell.swift */,
|
||||||
);
|
);
|
||||||
path = Browse;
|
path = Browse;
|
||||||
@@ -1124,6 +1127,7 @@
|
|||||||
BF770E6922BD57DD002A40FE /* Silence.m4a in Resources */,
|
BF770E6922BD57DD002A40FE /* Silence.m4a in Resources */,
|
||||||
BFD247772284B9A700981D42 /* Assets.xcassets in Resources */,
|
BFD247772284B9A700981D42 /* Assets.xcassets in Resources */,
|
||||||
BFD247752284B9A500981D42 /* Main.storyboard in Resources */,
|
BFD247752284B9A500981D42 /* Main.storyboard in Resources */,
|
||||||
|
BFDB5B2622EFBBEA00F74113 /* BrowseCollectionViewCell.xib in Resources */,
|
||||||
BFE6325A22A83BEB00F30809 /* Authentication.storyboard in Resources */,
|
BFE6325A22A83BEB00F30809 /* Authentication.storyboard in Resources */,
|
||||||
);
|
);
|
||||||
runOnlyForDeploymentPostprocessing = 0;
|
runOnlyForDeploymentPostprocessing = 0;
|
||||||
|
|||||||
@@ -319,6 +319,18 @@ class AppViewController: UIViewController
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
extension AppViewController
|
||||||
|
{
|
||||||
|
class func makeAppViewController(app: App) -> AppViewController
|
||||||
|
{
|
||||||
|
let storyboard = UIStoryboard(name: "Main", bundle: nil)
|
||||||
|
|
||||||
|
let appViewController = storyboard.instantiateViewController(withIdentifier: "appViewController") as! AppViewController
|
||||||
|
appViewController.app = app
|
||||||
|
return appViewController
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
private extension AppViewController
|
private extension AppViewController
|
||||||
{
|
{
|
||||||
func update()
|
func update()
|
||||||
|
|||||||
@@ -39,133 +39,12 @@
|
|||||||
<autoresizingMask key="autoresizingMask" widthSizable="YES" heightSizable="YES"/>
|
<autoresizingMask key="autoresizingMask" widthSizable="YES" heightSizable="YES"/>
|
||||||
<color key="backgroundColor" white="1" alpha="1" colorSpace="custom" customColorSpace="genericGamma22GrayColorSpace"/>
|
<color key="backgroundColor" white="1" alpha="1" colorSpace="custom" customColorSpace="genericGamma22GrayColorSpace"/>
|
||||||
<collectionViewFlowLayout key="collectionViewLayout" minimumLineSpacing="0.0" minimumInteritemSpacing="10" id="e0H-IH-rng">
|
<collectionViewFlowLayout key="collectionViewLayout" minimumLineSpacing="0.0" minimumInteritemSpacing="10" id="e0H-IH-rng">
|
||||||
<size key="itemSize" width="375" height="372"/>
|
<size key="itemSize" width="375" height="400"/>
|
||||||
<size key="headerReferenceSize" width="0.0" height="0.0"/>
|
<size key="headerReferenceSize" width="0.0" height="0.0"/>
|
||||||
<size key="footerReferenceSize" width="0.0" height="0.0"/>
|
<size key="footerReferenceSize" width="0.0" height="0.0"/>
|
||||||
<inset key="sectionInset" minX="0.0" minY="0.0" maxX="0.0" maxY="0.0"/>
|
<inset key="sectionInset" minX="0.0" minY="0.0" maxX="0.0" maxY="0.0"/>
|
||||||
</collectionViewFlowLayout>
|
</collectionViewFlowLayout>
|
||||||
<cells>
|
<cells/>
|
||||||
<collectionViewCell opaque="NO" clipsSubviews="YES" multipleTouchEnabled="YES" contentMode="center" reuseIdentifier="Cell" id="ofi-ID-YeW" customClass="BrowseCollectionViewCell" customModule="AltStore" customModuleProvider="target">
|
|
||||||
<rect key="frame" x="0.0" y="0.0" width="375" height="372"/>
|
|
||||||
<autoresizingMask key="autoresizingMask" flexibleMaxX="YES" flexibleMaxY="YES"/>
|
|
||||||
<view key="contentView" opaque="NO" clipsSubviews="YES" multipleTouchEnabled="YES" contentMode="center" insetsLayoutMarginsFromSafeArea="NO">
|
|
||||||
<rect key="frame" x="0.0" y="0.0" width="375" height="372"/>
|
|
||||||
<autoresizingMask key="autoresizingMask"/>
|
|
||||||
<subviews>
|
|
||||||
<stackView opaque="NO" contentMode="scaleToFill" alignment="center" spacing="11" translatesAutoresizingMaskIntoConstraints="NO" id="Qmy-fI-0do" userLabel="App Info">
|
|
||||||
<rect key="frame" x="20" y="20" width="335" height="65"/>
|
|
||||||
<subviews>
|
|
||||||
<imageView clipsSubviews="YES" userInteractionEnabled="NO" contentMode="scaleAspectFit" horizontalHuggingPriority="251" verticalHuggingPriority="251" translatesAutoresizingMaskIntoConstraints="NO" id="CXK-rw-bWe" customClass="AppIconImageView" customModule="AltStore" customModuleProvider="target">
|
|
||||||
<rect key="frame" x="0.0" y="0.0" width="65" height="65"/>
|
|
||||||
<constraints>
|
|
||||||
<constraint firstAttribute="width" secondItem="CXK-rw-bWe" secondAttribute="height" multiplier="1:1" id="GRJ-Zv-m2F"/>
|
|
||||||
<constraint firstAttribute="height" constant="65" id="Y9m-Am-Kjl"/>
|
|
||||||
</constraints>
|
|
||||||
</imageView>
|
|
||||||
<stackView opaque="NO" contentMode="scaleToFill" verticalHuggingPriority="100" axis="vertical" spacing="2" translatesAutoresizingMaskIntoConstraints="NO" id="M2b-41-kPM">
|
|
||||||
<rect key="frame" x="76" y="14" width="176" height="37"/>
|
|
||||||
<subviews>
|
|
||||||
<label opaque="NO" userInteractionEnabled="NO" contentMode="left" horizontalHuggingPriority="100" verticalHuggingPriority="251" text="App Name" textAlignment="natural" lineBreakMode="tailTruncation" baselineAdjustment="alignBaselines" adjustsFontSizeToFit="NO" translatesAutoresizingMaskIntoConstraints="NO" id="Bdj-E8-Jzp">
|
|
||||||
<rect key="frame" x="0.0" y="0.0" width="176" height="20.5"/>
|
|
||||||
<fontDescription key="fontDescription" style="UICTFontTextStyleBody"/>
|
|
||||||
<nil key="textColor"/>
|
|
||||||
<nil key="highlightedColor"/>
|
|
||||||
</label>
|
|
||||||
<label opaque="NO" userInteractionEnabled="NO" contentMode="left" horizontalHuggingPriority="100" verticalHuggingPriority="251" text="Developer" textAlignment="natural" lineBreakMode="tailTruncation" baselineAdjustment="alignBaselines" adjustsFontSizeToFit="NO" translatesAutoresizingMaskIntoConstraints="NO" id="lpO-8T-aGe">
|
|
||||||
<rect key="frame" x="0.0" y="22.5" width="176" height="14.5"/>
|
|
||||||
<fontDescription key="fontDescription" style="UICTFontTextStyleCaption1"/>
|
|
||||||
<color key="textColor" white="0.66666666666666663" alpha="1" colorSpace="custom" customColorSpace="genericGamma22GrayColorSpace"/>
|
|
||||||
<nil key="highlightedColor"/>
|
|
||||||
</label>
|
|
||||||
</subviews>
|
|
||||||
</stackView>
|
|
||||||
<button opaque="NO" contentMode="scaleToFill" contentHorizontalAlignment="center" contentVerticalAlignment="center" buttonType="roundedRect" lineBreakMode="middleTruncation" translatesAutoresizingMaskIntoConstraints="NO" id="xCW-7H-lc3" customClass="PillButton" customModule="AltStore" customModuleProvider="target">
|
|
||||||
<rect key="frame" x="263" y="17" width="72" height="31"/>
|
|
||||||
<color key="backgroundColor" red="0.22352941176470589" green="0.49411764705882355" blue="0.396078431372549" alpha="0.10000000000000001" colorSpace="custom" customColorSpace="sRGB"/>
|
|
||||||
<constraints>
|
|
||||||
<constraint firstAttribute="width" constant="72" id="LDp-OV-97J"/>
|
|
||||||
<constraint firstAttribute="height" constant="31" id="ZUE-0U-ROX"/>
|
|
||||||
</constraints>
|
|
||||||
<fontDescription key="fontDescription" type="boldSystem" pointSize="14"/>
|
|
||||||
<state key="normal" title="OPEN"/>
|
|
||||||
<connections>
|
|
||||||
<action selector="performAppAction:" destination="e3L-BF-iXp" eventType="primaryActionTriggered" id="0jZ-Ql-ALs"/>
|
|
||||||
</connections>
|
|
||||||
</button>
|
|
||||||
</subviews>
|
|
||||||
</stackView>
|
|
||||||
<view contentMode="scaleToFill" translatesAutoresizingMaskIntoConstraints="NO" id="P9V-7N-kV7" userLabel="Screenshots">
|
|
||||||
<rect key="frame" x="15" y="100" width="345" height="252"/>
|
|
||||||
<subviews>
|
|
||||||
<stackView opaque="NO" contentMode="scaleToFill" axis="vertical" spacing="15" translatesAutoresizingMaskIntoConstraints="NO" id="K2h-4K-tEf">
|
|
||||||
<rect key="frame" x="0.0" y="0.0" width="345" height="252"/>
|
|
||||||
<subviews>
|
|
||||||
<label opaque="NO" userInteractionEnabled="NO" contentMode="left" horizontalHuggingPriority="251" verticalHuggingPriority="251" text="Classic Nintendo games in your pocket." textAlignment="center" lineBreakMode="tailTruncation" baselineAdjustment="alignBaselines" adjustsFontSizeToFit="NO" translatesAutoresizingMaskIntoConstraints="NO" id="L3d-OX-f9e">
|
|
||||||
<rect key="frame" x="20" y="15" width="305" height="17"/>
|
|
||||||
<fontDescription key="fontDescription" type="system" pointSize="14"/>
|
|
||||||
<color key="textColor" red="1" green="0.14901960780000001" blue="0.0" alpha="1" colorSpace="custom" customColorSpace="sRGB"/>
|
|
||||||
<nil key="highlightedColor"/>
|
|
||||||
</label>
|
|
||||||
<collectionView clipsSubviews="YES" multipleTouchEnabled="YES" userInteractionEnabled="NO" contentMode="scaleToFill" contentInsetAdjustmentBehavior="never" dataMode="prototypes" translatesAutoresizingMaskIntoConstraints="NO" id="wnA-ZZ-fwF">
|
|
||||||
<rect key="frame" x="20" y="47" width="305" height="185"/>
|
|
||||||
<color key="backgroundColor" white="0.0" alpha="0.0" colorSpace="custom" customColorSpace="genericGamma22GrayColorSpace"/>
|
|
||||||
<constraints>
|
|
||||||
<constraint firstAttribute="height" constant="185" id="x3q-LQ-mXd"/>
|
|
||||||
</constraints>
|
|
||||||
<collectionViewFlowLayout key="collectionViewLayout" minimumLineSpacing="0.0" minimumInteritemSpacing="0.0" id="g2J-u0-NvJ">
|
|
||||||
<size key="itemSize" width="50" height="0.0"/>
|
|
||||||
<size key="headerReferenceSize" width="0.0" height="0.0"/>
|
|
||||||
<size key="footerReferenceSize" width="0.0" height="0.0"/>
|
|
||||||
<inset key="sectionInset" minX="0.0" minY="0.0" maxX="0.0" maxY="0.0"/>
|
|
||||||
</collectionViewFlowLayout>
|
|
||||||
<cells>
|
|
||||||
<collectionViewCell opaque="NO" clipsSubviews="YES" multipleTouchEnabled="YES" contentMode="center" reuseIdentifier="Cell" id="xlX-GE-9nO" customClass="ScreenshotCollectionViewCell">
|
|
||||||
<rect key="frame" x="0.0" y="0.0" width="50" height="0.0"/>
|
|
||||||
<autoresizingMask key="autoresizingMask" flexibleMaxX="YES" flexibleMaxY="YES"/>
|
|
||||||
<view key="contentView" opaque="NO" clipsSubviews="YES" multipleTouchEnabled="YES" contentMode="center" insetsLayoutMarginsFromSafeArea="NO">
|
|
||||||
<rect key="frame" x="0.0" y="0.0" width="50" height="0.0"/>
|
|
||||||
<autoresizingMask key="autoresizingMask"/>
|
|
||||||
</view>
|
|
||||||
</collectionViewCell>
|
|
||||||
</cells>
|
|
||||||
</collectionView>
|
|
||||||
</subviews>
|
|
||||||
<edgeInsets key="layoutMargins" top="15" left="20" bottom="20" right="20"/>
|
|
||||||
</stackView>
|
|
||||||
</subviews>
|
|
||||||
<color key="backgroundColor" red="1" green="0.14901960780000001" blue="0.0" alpha="0.050000000000000003" colorSpace="custom" customColorSpace="sRGB"/>
|
|
||||||
<constraints>
|
|
||||||
<constraint firstAttribute="bottom" secondItem="K2h-4K-tEf" secondAttribute="bottom" id="RPX-HI-VGa"/>
|
|
||||||
<constraint firstAttribute="trailing" secondItem="K2h-4K-tEf" secondAttribute="trailing" id="mLS-R0-ZeU"/>
|
|
||||||
<constraint firstItem="K2h-4K-tEf" firstAttribute="top" secondItem="P9V-7N-kV7" secondAttribute="top" id="r7P-xH-pzs"/>
|
|
||||||
<constraint firstItem="K2h-4K-tEf" firstAttribute="leading" secondItem="P9V-7N-kV7" secondAttribute="leading" id="tY4-Ta-ec2"/>
|
|
||||||
</constraints>
|
|
||||||
</view>
|
|
||||||
</subviews>
|
|
||||||
</view>
|
|
||||||
<constraints>
|
|
||||||
<constraint firstItem="P9V-7N-kV7" firstAttribute="leading" secondItem="ofi-ID-YeW" secondAttribute="leading" constant="15" id="WeY-x3-kYd"/>
|
|
||||||
<constraint firstAttribute="trailing" secondItem="Qmy-fI-0do" secondAttribute="trailing" constant="20" id="dar-0I-2Zt"/>
|
|
||||||
<constraint firstAttribute="bottom" secondItem="P9V-7N-kV7" secondAttribute="bottom" constant="20" id="qxV-1c-5fe"/>
|
|
||||||
<constraint firstItem="Qmy-fI-0do" firstAttribute="leading" secondItem="ofi-ID-YeW" secondAttribute="leading" constant="20" id="r1c-ZM-cIP"/>
|
|
||||||
<constraint firstItem="Qmy-fI-0do" firstAttribute="top" secondItem="ofi-ID-YeW" secondAttribute="top" constant="20" id="uYg-jP-c9b"/>
|
|
||||||
<constraint firstAttribute="trailing" secondItem="P9V-7N-kV7" secondAttribute="trailing" constant="15" id="umj-rz-TS3"/>
|
|
||||||
</constraints>
|
|
||||||
<connections>
|
|
||||||
<outlet property="actionButton" destination="xCW-7H-lc3" id="7iL-lM-AEP"/>
|
|
||||||
<outlet property="appIconImageView" destination="CXK-rw-bWe" id="UIK-Ps-dlD"/>
|
|
||||||
<outlet property="developerLabel" destination="lpO-8T-aGe" id="U0r-qS-Ify"/>
|
|
||||||
<outlet property="nameLabel" destination="Bdj-E8-Jzp" id="dlr-bl-tOq"/>
|
|
||||||
<outlet property="screenshotsCollectionView" destination="wnA-ZZ-fwF" id="dcp-DC-GtH"/>
|
|
||||||
<outlet property="screenshotsContentView" destination="P9V-7N-kV7" id="7mg-7o-ckH"/>
|
|
||||||
<outlet property="subtitleLabel" destination="L3d-OX-f9e" id="ERX-nn-g4g"/>
|
|
||||||
<segue destination="0V6-N4-hTO" kind="show" identifier="showApp" id="SY2-HI-heA">
|
|
||||||
<segue key="commit" inheritsFrom="parent" id="dNL-ZX-8vh"/>
|
|
||||||
<segue key="preview" inheritsFrom="commit" id="gjN-bg-1G5"/>
|
|
||||||
</segue>
|
|
||||||
</connections>
|
|
||||||
</collectionViewCell>
|
|
||||||
</cells>
|
|
||||||
<connections>
|
<connections>
|
||||||
<outlet property="dataSource" destination="e3L-BF-iXp" id="ARv-GZ-Gc2"/>
|
<outlet property="dataSource" destination="e3L-BF-iXp" id="ARv-GZ-Gc2"/>
|
||||||
<outlet property="delegate" destination="e3L-BF-iXp" id="Mdp-x4-hZe"/>
|
<outlet property="delegate" destination="e3L-BF-iXp" id="Mdp-x4-hZe"/>
|
||||||
@@ -180,7 +59,7 @@
|
|||||||
<!--App View Controller-->
|
<!--App View Controller-->
|
||||||
<scene sceneID="TgT-LO-3Er">
|
<scene sceneID="TgT-LO-3Er">
|
||||||
<objects>
|
<objects>
|
||||||
<viewController id="0V6-N4-hTO" customClass="AppViewController" customModule="AltStore" customModuleProvider="target" sceneMemberID="viewController">
|
<viewController storyboardIdentifier="appViewController" id="0V6-N4-hTO" customClass="AppViewController" customModule="AltStore" customModuleProvider="target" sceneMemberID="viewController">
|
||||||
<view key="view" contentMode="scaleToFill" id="0cR-li-tCB">
|
<view key="view" contentMode="scaleToFill" id="0cR-li-tCB">
|
||||||
<rect key="frame" x="0.0" y="0.0" width="375" height="667"/>
|
<rect key="frame" x="0.0" y="0.0" width="375" height="667"/>
|
||||||
<autoresizingMask key="autoresizingMask" widthSizable="YES" heightSizable="YES"/>
|
<autoresizingMask key="autoresizingMask" widthSizable="YES" heightSizable="YES"/>
|
||||||
@@ -1026,7 +905,7 @@ World</string>
|
|||||||
</namedColor>
|
</namedColor>
|
||||||
</resources>
|
</resources>
|
||||||
<inferredMetricsTieBreakers>
|
<inferredMetricsTieBreakers>
|
||||||
<segue reference="gjN-bg-1G5"/>
|
<segue reference="cnd-KK-o60"/>
|
||||||
</inferredMetricsTieBreakers>
|
</inferredMetricsTieBreakers>
|
||||||
<color key="tintColor" name="Green"/>
|
<color key="tintColor" name="Green"/>
|
||||||
</document>
|
</document>
|
||||||
|
|||||||
@@ -19,21 +19,23 @@ import Roxas
|
|||||||
}
|
}
|
||||||
private lazy var dataSource = self.makeDataSource()
|
private lazy var dataSource = self.makeDataSource()
|
||||||
|
|
||||||
private lazy var imageSizes = [NSString: CGSize]()
|
|
||||||
|
|
||||||
@IBOutlet var nameLabel: UILabel!
|
@IBOutlet var nameLabel: UILabel!
|
||||||
@IBOutlet var developerLabel: UILabel!
|
@IBOutlet var developerLabel: UILabel!
|
||||||
@IBOutlet var appIconImageView: UIImageView!
|
@IBOutlet var appIconImageView: UIImageView!
|
||||||
@IBOutlet var actionButton: PillButton!
|
@IBOutlet var actionButton: PillButton!
|
||||||
@IBOutlet var subtitleLabel: UILabel!
|
@IBOutlet var subtitleLabel: UILabel!
|
||||||
|
|
||||||
|
@IBOutlet var screenshotsCollectionView: UICollectionView!
|
||||||
|
|
||||||
@IBOutlet private var screenshotsContentView: UIView!
|
@IBOutlet private var screenshotsContentView: UIView!
|
||||||
@IBOutlet private var screenshotsCollectionView: UICollectionView!
|
|
||||||
|
|
||||||
override func awakeFromNib()
|
override func awakeFromNib()
|
||||||
{
|
{
|
||||||
super.awakeFromNib()
|
super.awakeFromNib()
|
||||||
|
|
||||||
|
// Must be registered programmatically, not in BrowseCollectionViewCell.xib, or else it'll throw an exception 🤷♂️.
|
||||||
|
self.screenshotsCollectionView.register(ScreenshotCollectionViewCell.self, forCellWithReuseIdentifier: RSTCellContentGenericCellIdentifier)
|
||||||
|
|
||||||
self.screenshotsCollectionView.delegate = self
|
self.screenshotsCollectionView.delegate = self
|
||||||
self.screenshotsCollectionView.dataSource = self.dataSource
|
self.screenshotsCollectionView.dataSource = self.dataSource
|
||||||
self.screenshotsCollectionView.prefetchDataSource = self.dataSource
|
self.screenshotsCollectionView.prefetchDataSource = self.dataSource
|
||||||
@@ -59,6 +61,7 @@ private extension BrowseCollectionViewCell
|
|||||||
let dataSource = RSTArrayCollectionViewPrefetchingDataSource<NSString, UIImage>(items: [])
|
let dataSource = RSTArrayCollectionViewPrefetchingDataSource<NSString, UIImage>(items: [])
|
||||||
dataSource.cellConfigurationHandler = { (cell, screenshot, indexPath) in
|
dataSource.cellConfigurationHandler = { (cell, screenshot, indexPath) in
|
||||||
let cell = cell as! ScreenshotCollectionViewCell
|
let cell = cell as! ScreenshotCollectionViewCell
|
||||||
|
cell.imageView.image = nil
|
||||||
cell.imageView.isIndicatingActivity = true
|
cell.imageView.isIndicatingActivity = true
|
||||||
}
|
}
|
||||||
dataSource.prefetchHandler = { (imageName, indexPath, completion) in
|
dataSource.prefetchHandler = { (imageName, indexPath, completion) in
|
||||||
@@ -87,15 +90,13 @@ extension BrowseCollectionViewCell: UICollectionViewDelegateFlowLayout
|
|||||||
{
|
{
|
||||||
func collectionView(_ collectionView: UICollectionView, layout collectionViewLayout: UICollectionViewLayout, sizeForItemAt indexPath: IndexPath) -> CGSize
|
func collectionView(_ collectionView: UICollectionView, layout collectionViewLayout: UICollectionViewLayout, sizeForItemAt indexPath: IndexPath) -> CGSize
|
||||||
{
|
{
|
||||||
let imageURL = self.dataSource.item(at: indexPath)
|
// Assuming 9.0 / 16.0 ratio for now.
|
||||||
let dimensions = self.imageSizes[imageURL] ?? UIScreen.main.nativeBounds.size
|
let aspectRatio: CGFloat = 9.0 / 16.0
|
||||||
|
|
||||||
let aspectRatio = dimensions.width / dimensions.height
|
let itemHeight = collectionView.bounds.height
|
||||||
|
let itemWidth = itemHeight * aspectRatio
|
||||||
|
|
||||||
let height = self.screenshotsCollectionView.bounds.height
|
let size = CGSize(width: itemWidth.rounded(.down), height: itemHeight.rounded(.down))
|
||||||
let width = (self.screenshotsCollectionView.bounds.height * aspectRatio).rounded(.down)
|
|
||||||
|
|
||||||
let size = CGSize(width: width, height: height)
|
|
||||||
return size
|
return size
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
119
AltStore/Browse/BrowseCollectionViewCell.xib
Normal file
119
AltStore/Browse/BrowseCollectionViewCell.xib
Normal file
@@ -0,0 +1,119 @@
|
|||||||
|
<?xml version="1.0" encoding="UTF-8"?>
|
||||||
|
<document type="com.apple.InterfaceBuilder3.CocoaTouch.XIB" version="3.0" toolsVersion="14490.70" targetRuntime="iOS.CocoaTouch" propertyAccessControl="none" useAutolayout="YES" useTraitCollections="YES" useSafeAreas="YES" colorMatched="YES">
|
||||||
|
<device id="retina6_1" orientation="portrait">
|
||||||
|
<adaptation id="fullscreen"/>
|
||||||
|
</device>
|
||||||
|
<dependencies>
|
||||||
|
<deployment identifier="iOS"/>
|
||||||
|
<plugIn identifier="com.apple.InterfaceBuilder.IBCocoaTouchPlugin" version="14490.49"/>
|
||||||
|
<capability name="Safe area layout guides" minToolsVersion="9.0"/>
|
||||||
|
<capability name="documents saved in the Xcode 8 format" minToolsVersion="8.0"/>
|
||||||
|
</dependencies>
|
||||||
|
<objects>
|
||||||
|
<placeholder placeholderIdentifier="IBFilesOwner" id="-1" userLabel="File's Owner"/>
|
||||||
|
<placeholder placeholderIdentifier="IBFirstResponder" id="-2" customClass="UIResponder"/>
|
||||||
|
<collectionViewCell opaque="NO" clipsSubviews="YES" multipleTouchEnabled="YES" contentMode="center" reuseIdentifier="Cell" id="ln4-pC-7KY" customClass="BrowseCollectionViewCell" customModule="AltStore" customModuleProvider="target">
|
||||||
|
<rect key="frame" x="0.0" y="0.0" width="375" height="400"/>
|
||||||
|
<autoresizingMask key="autoresizingMask" flexibleMaxX="YES" flexibleMaxY="YES"/>
|
||||||
|
<view key="contentView" opaque="NO" clipsSubviews="YES" multipleTouchEnabled="YES" contentMode="center" insetsLayoutMarginsFromSafeArea="NO">
|
||||||
|
<rect key="frame" x="0.0" y="0.0" width="375" height="400"/>
|
||||||
|
<autoresizingMask key="autoresizingMask"/>
|
||||||
|
<subviews>
|
||||||
|
<stackView opaque="NO" contentMode="scaleToFill" alignment="center" spacing="11" translatesAutoresizingMaskIntoConstraints="NO" id="Y3g-Md-6xH" userLabel="App Info">
|
||||||
|
<rect key="frame" x="20" y="20" width="335" height="79"/>
|
||||||
|
<subviews>
|
||||||
|
<imageView clipsSubviews="YES" userInteractionEnabled="NO" contentMode="scaleAspectFit" horizontalHuggingPriority="251" verticalHuggingPriority="251" translatesAutoresizingMaskIntoConstraints="NO" id="F2j-pX-09A" customClass="AppIconImageView" customModule="AltStore" customModuleProvider="target">
|
||||||
|
<rect key="frame" x="0.0" y="7" width="65" height="65"/>
|
||||||
|
<constraints>
|
||||||
|
<constraint firstAttribute="width" secondItem="F2j-pX-09A" secondAttribute="height" multiplier="1:1" id="c2j-8O-Diw"/>
|
||||||
|
<constraint firstAttribute="height" constant="65" id="ufl-3d-nkT"/>
|
||||||
|
</constraints>
|
||||||
|
</imageView>
|
||||||
|
<stackView opaque="NO" contentMode="scaleToFill" verticalHuggingPriority="100" axis="vertical" spacing="2" translatesAutoresizingMaskIntoConstraints="NO" id="zkp-KH-OyV">
|
||||||
|
<rect key="frame" x="76" y="21" width="176" height="37"/>
|
||||||
|
<subviews>
|
||||||
|
<label opaque="NO" userInteractionEnabled="NO" contentMode="left" horizontalHuggingPriority="100" verticalHuggingPriority="251" text="App Name" textAlignment="natural" lineBreakMode="tailTruncation" baselineAdjustment="alignBaselines" adjustsFontSizeToFit="NO" translatesAutoresizingMaskIntoConstraints="NO" id="xni-8I-ewW">
|
||||||
|
<rect key="frame" x="0.0" y="0.0" width="176" height="20.5"/>
|
||||||
|
<fontDescription key="fontDescription" style="UICTFontTextStyleBody"/>
|
||||||
|
<nil key="textColor"/>
|
||||||
|
<nil key="highlightedColor"/>
|
||||||
|
</label>
|
||||||
|
<label opaque="NO" userInteractionEnabled="NO" contentMode="left" horizontalHuggingPriority="100" verticalHuggingPriority="251" text="Developer" textAlignment="natural" lineBreakMode="tailTruncation" baselineAdjustment="alignBaselines" adjustsFontSizeToFit="NO" translatesAutoresizingMaskIntoConstraints="NO" id="B5S-HI-tWJ">
|
||||||
|
<rect key="frame" x="0.0" y="22.5" width="176" height="14.5"/>
|
||||||
|
<fontDescription key="fontDescription" style="UICTFontTextStyleCaption1"/>
|
||||||
|
<color key="textColor" white="0.66666666669999997" alpha="1" colorSpace="custom" customColorSpace="genericGamma22GrayColorSpace"/>
|
||||||
|
<nil key="highlightedColor"/>
|
||||||
|
</label>
|
||||||
|
</subviews>
|
||||||
|
</stackView>
|
||||||
|
<button opaque="NO" contentMode="scaleToFill" contentHorizontalAlignment="center" contentVerticalAlignment="center" buttonType="roundedRect" lineBreakMode="middleTruncation" translatesAutoresizingMaskIntoConstraints="NO" id="DeC-Y2-fvR" customClass="PillButton" customModule="AltStore" customModuleProvider="target">
|
||||||
|
<rect key="frame" x="263" y="24" width="72" height="31"/>
|
||||||
|
<color key="backgroundColor" red="0.22352941179999999" green="0.4941176471" blue="0.39607843139999999" alpha="0.10000000000000001" colorSpace="custom" customColorSpace="sRGB"/>
|
||||||
|
<constraints>
|
||||||
|
<constraint firstAttribute="width" constant="72" id="X7D-DN-WnD"/>
|
||||||
|
<constraint firstAttribute="height" constant="31" id="svo-Sc-wpR"/>
|
||||||
|
</constraints>
|
||||||
|
<fontDescription key="fontDescription" type="boldSystem" pointSize="14"/>
|
||||||
|
<state key="normal" title="OPEN"/>
|
||||||
|
</button>
|
||||||
|
</subviews>
|
||||||
|
</stackView>
|
||||||
|
<view contentMode="scaleToFill" translatesAutoresizingMaskIntoConstraints="NO" id="w1r-LJ-TDs" userLabel="Screenshots">
|
||||||
|
<rect key="frame" x="15" y="114" width="345" height="266"/>
|
||||||
|
<subviews>
|
||||||
|
<stackView opaque="NO" contentMode="scaleToFill" axis="vertical" spacing="15" translatesAutoresizingMaskIntoConstraints="NO" id="hRR-84-Owd">
|
||||||
|
<rect key="frame" x="0.0" y="0.0" width="345" height="266"/>
|
||||||
|
<subviews>
|
||||||
|
<label opaque="NO" userInteractionEnabled="NO" contentMode="left" horizontalHuggingPriority="251" verticalHuggingPriority="251" text="Classic Nintendo games in your pocket." textAlignment="center" lineBreakMode="tailTruncation" baselineAdjustment="alignBaselines" minimumScaleFactor="0.5" translatesAutoresizingMaskIntoConstraints="NO" id="Imx-Le-bcy">
|
||||||
|
<rect key="frame" x="20" y="15" width="305" height="17"/>
|
||||||
|
<fontDescription key="fontDescription" type="system" pointSize="14"/>
|
||||||
|
<color key="textColor" red="1" green="0.14901960780000001" blue="0.0" alpha="1" colorSpace="custom" customColorSpace="sRGB"/>
|
||||||
|
<nil key="highlightedColor"/>
|
||||||
|
</label>
|
||||||
|
<collectionView clipsSubviews="YES" multipleTouchEnabled="YES" userInteractionEnabled="NO" contentMode="scaleToFill" contentInsetAdjustmentBehavior="never" dataMode="prototypes" translatesAutoresizingMaskIntoConstraints="NO" id="RFs-qp-Ca4">
|
||||||
|
<rect key="frame" x="20" y="47" width="305" height="185"/>
|
||||||
|
<color key="backgroundColor" white="0.0" alpha="0.0" colorSpace="custom" customColorSpace="genericGamma22GrayColorSpace"/>
|
||||||
|
<collectionViewFlowLayout key="collectionViewLayout" minimumLineSpacing="0.0" minimumInteritemSpacing="10" id="jH9-Jo-IHA">
|
||||||
|
<size key="itemSize" width="120" height="213"/>
|
||||||
|
<size key="headerReferenceSize" width="0.0" height="0.0"/>
|
||||||
|
<size key="footerReferenceSize" width="0.0" height="0.0"/>
|
||||||
|
<inset key="sectionInset" minX="0.0" minY="0.0" maxX="0.0" maxY="0.0"/>
|
||||||
|
</collectionViewFlowLayout>
|
||||||
|
<cells/>
|
||||||
|
</collectionView>
|
||||||
|
</subviews>
|
||||||
|
<edgeInsets key="layoutMargins" top="15" left="20" bottom="20" right="20"/>
|
||||||
|
</stackView>
|
||||||
|
</subviews>
|
||||||
|
<color key="backgroundColor" red="1" green="0.14901960780000001" blue="0.0" alpha="0.050000000000000003" colorSpace="custom" customColorSpace="sRGB"/>
|
||||||
|
<constraints>
|
||||||
|
<constraint firstItem="hRR-84-Owd" firstAttribute="leading" secondItem="w1r-LJ-TDs" secondAttribute="leading" id="3us-zR-peW"/>
|
||||||
|
<constraint firstItem="hRR-84-Owd" firstAttribute="top" secondItem="w1r-LJ-TDs" secondAttribute="top" id="HWW-aS-Scd"/>
|
||||||
|
<constraint firstAttribute="trailing" secondItem="hRR-84-Owd" secondAttribute="trailing" id="lbU-TC-jhJ"/>
|
||||||
|
<constraint firstAttribute="bottom" secondItem="hRR-84-Owd" secondAttribute="bottom" id="nOI-Qj-lbm"/>
|
||||||
|
</constraints>
|
||||||
|
</view>
|
||||||
|
</subviews>
|
||||||
|
</view>
|
||||||
|
<constraints>
|
||||||
|
<constraint firstAttribute="trailing" secondItem="w1r-LJ-TDs" secondAttribute="trailing" constant="15" id="4ns-Zq-D4j"/>
|
||||||
|
<constraint firstItem="w1r-LJ-TDs" firstAttribute="leading" secondItem="ln4-pC-7KY" secondAttribute="leading" constant="15" id="G1K-up-08u"/>
|
||||||
|
<constraint firstAttribute="bottom" secondItem="w1r-LJ-TDs" secondAttribute="bottom" constant="20" id="Kk0-dF-4OW"/>
|
||||||
|
<constraint firstItem="Y3g-Md-6xH" firstAttribute="top" secondItem="ln4-pC-7KY" secondAttribute="top" constant="20" id="PRR-aX-AiM"/>
|
||||||
|
<constraint firstAttribute="trailing" secondItem="Y3g-Md-6xH" secondAttribute="trailing" constant="20" id="g1Q-lg-I9O"/>
|
||||||
|
<constraint firstItem="w1r-LJ-TDs" firstAttribute="top" secondItem="Y3g-Md-6xH" secondAttribute="bottom" constant="15" id="i9W-bl-J9R"/>
|
||||||
|
<constraint firstItem="Y3g-Md-6xH" firstAttribute="leading" secondItem="ln4-pC-7KY" secondAttribute="leading" constant="20" id="j6L-IY-ALs"/>
|
||||||
|
</constraints>
|
||||||
|
<viewLayoutGuide key="safeArea" id="btu-iP-81i"/>
|
||||||
|
<connections>
|
||||||
|
<outlet property="actionButton" destination="DeC-Y2-fvR" id="VDk-4D-STy"/>
|
||||||
|
<outlet property="appIconImageView" destination="F2j-pX-09A" id="COe-74-adn"/>
|
||||||
|
<outlet property="developerLabel" destination="B5S-HI-tWJ" id="QGh-1g-fFv"/>
|
||||||
|
<outlet property="nameLabel" destination="xni-8I-ewW" id="V56-ZT-vFa"/>
|
||||||
|
<outlet property="screenshotsCollectionView" destination="RFs-qp-Ca4" id="xfi-AN-l17"/>
|
||||||
|
<outlet property="screenshotsContentView" destination="w1r-LJ-TDs" id="iWJ-52-rbA"/>
|
||||||
|
<outlet property="subtitleLabel" destination="Imx-Le-bcy" id="JVW-ZZ-51O"/>
|
||||||
|
</connections>
|
||||||
|
</collectionViewCell>
|
||||||
|
</objects>
|
||||||
|
</document>
|
||||||
@@ -14,12 +14,22 @@ class BrowseViewController: UICollectionViewController
|
|||||||
{
|
{
|
||||||
private lazy var dataSource = self.makeDataSource()
|
private lazy var dataSource = self.makeDataSource()
|
||||||
|
|
||||||
|
private let prototypeCell = BrowseCollectionViewCell.instantiate(with: BrowseCollectionViewCell.nib!)!
|
||||||
|
|
||||||
|
private var cachedItemSizes = [String: CGSize]()
|
||||||
|
|
||||||
override func viewDidLoad()
|
override func viewDidLoad()
|
||||||
{
|
{
|
||||||
super.viewDidLoad()
|
super.viewDidLoad()
|
||||||
|
|
||||||
|
self.prototypeCell.contentView.translatesAutoresizingMaskIntoConstraints = false
|
||||||
|
|
||||||
|
self.collectionView.register(BrowseCollectionViewCell.nib, forCellWithReuseIdentifier: RSTCellContentGenericCellIdentifier)
|
||||||
|
|
||||||
self.collectionView.dataSource = self.dataSource
|
self.collectionView.dataSource = self.dataSource
|
||||||
self.collectionView.prefetchDataSource = self.dataSource
|
self.collectionView.prefetchDataSource = self.dataSource
|
||||||
|
|
||||||
|
self.registerForPreviewing(with: self, sourceView: self.collectionView)
|
||||||
}
|
}
|
||||||
|
|
||||||
override func viewWillAppear(_ animated: Bool)
|
override func viewWillAppear(_ animated: Bool)
|
||||||
@@ -29,14 +39,6 @@ class BrowseViewController: UICollectionViewController
|
|||||||
self.fetchApps()
|
self.fetchApps()
|
||||||
}
|
}
|
||||||
|
|
||||||
override func viewDidLayoutSubviews()
|
|
||||||
{
|
|
||||||
super.viewDidLayoutSubviews()
|
|
||||||
|
|
||||||
let collectionViewLayout = self.collectionViewLayout as! UICollectionViewFlowLayout
|
|
||||||
collectionViewLayout.itemSize.width = self.view.bounds.width
|
|
||||||
}
|
|
||||||
|
|
||||||
override func prepare(for segue: UIStoryboardSegue, sender: Any?)
|
override func prepare(for segue: UIStoryboardSegue, sender: Any?)
|
||||||
{
|
{
|
||||||
guard segue.identifier == "showApp" else { return }
|
guard segue.identifier == "showApp" else { return }
|
||||||
@@ -166,3 +168,73 @@ private extension BrowseViewController
|
|||||||
UIApplication.shared.open(installedApp.openAppURL)
|
UIApplication.shared.open(installedApp.openAppURL)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
extension BrowseViewController: UICollectionViewDelegateFlowLayout
|
||||||
|
{
|
||||||
|
func collectionView(_ collectionView: UICollectionView, layout collectionViewLayout: UICollectionViewLayout, sizeForItemAt indexPath: IndexPath) -> CGSize
|
||||||
|
{
|
||||||
|
let item = self.dataSource.item(at: indexPath)
|
||||||
|
|
||||||
|
if let previousSize = self.cachedItemSizes[item.bundleIdentifier]
|
||||||
|
{
|
||||||
|
return previousSize
|
||||||
|
}
|
||||||
|
|
||||||
|
let maxVisibleScreenshots = 2 as CGFloat
|
||||||
|
let aspectRatio: CGFloat = 16.0 / 9.0
|
||||||
|
|
||||||
|
let layout = collectionViewLayout as! UICollectionViewFlowLayout
|
||||||
|
let padding = (layout.minimumInteritemSpacing * (maxVisibleScreenshots - 1))
|
||||||
|
|
||||||
|
self.dataSource.cellConfigurationHandler(self.prototypeCell, item, indexPath)
|
||||||
|
|
||||||
|
let widthConstraint = self.prototypeCell.contentView.widthAnchor.constraint(equalToConstant: collectionView.bounds.width)
|
||||||
|
widthConstraint.isActive = true
|
||||||
|
defer { widthConstraint.isActive = false }
|
||||||
|
|
||||||
|
self.prototypeCell.layoutIfNeeded()
|
||||||
|
|
||||||
|
let collectionViewWidth = self.prototypeCell.screenshotsCollectionView.bounds.width
|
||||||
|
let screenshotWidth = ((collectionViewWidth - padding) / maxVisibleScreenshots).rounded(.down)
|
||||||
|
let screenshotHeight = screenshotWidth * aspectRatio
|
||||||
|
|
||||||
|
let heightConstraint = self.prototypeCell.screenshotsCollectionView.heightAnchor.constraint(equalToConstant: screenshotHeight)
|
||||||
|
heightConstraint.isActive = true
|
||||||
|
defer { heightConstraint.isActive = false }
|
||||||
|
|
||||||
|
let itemSize = self.prototypeCell.contentView.systemLayoutSizeFitting(UIView.layoutFittingCompressedSize)
|
||||||
|
self.cachedItemSizes[item.bundleIdentifier] = itemSize
|
||||||
|
return itemSize
|
||||||
|
}
|
||||||
|
|
||||||
|
override func collectionView(_ collectionView: UICollectionView, didSelectItemAt indexPath: IndexPath)
|
||||||
|
{
|
||||||
|
let app = self.dataSource.item(at: indexPath)
|
||||||
|
|
||||||
|
let appViewController = AppViewController.makeAppViewController(app: app)
|
||||||
|
self.navigationController?.pushViewController(appViewController, animated: true)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
extension BrowseViewController: UIViewControllerPreviewingDelegate
|
||||||
|
{
|
||||||
|
func previewingContext(_ previewingContext: UIViewControllerPreviewing, viewControllerForLocation location: CGPoint) -> UIViewController?
|
||||||
|
{
|
||||||
|
guard
|
||||||
|
let indexPath = self.collectionView.indexPathForItem(at: location),
|
||||||
|
let cell = self.collectionView.cellForItem(at: indexPath)
|
||||||
|
else { return nil }
|
||||||
|
|
||||||
|
previewingContext.sourceRect = cell.frame
|
||||||
|
|
||||||
|
let app = self.dataSource.item(at: indexPath)
|
||||||
|
|
||||||
|
let appViewController = AppViewController.makeAppViewController(app: app)
|
||||||
|
return appViewController
|
||||||
|
}
|
||||||
|
|
||||||
|
func previewingContext(_ previewingContext: UIViewControllerPreviewing, commit viewControllerToCommit: UIViewController)
|
||||||
|
{
|
||||||
|
self.navigationController?.pushViewController(viewControllerToCommit, animated: true)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|||||||
@@ -13,15 +13,25 @@ import Roxas
|
|||||||
@objc(ScreenshotCollectionViewCell)
|
@objc(ScreenshotCollectionViewCell)
|
||||||
class ScreenshotCollectionViewCell: UICollectionViewCell
|
class ScreenshotCollectionViewCell: UICollectionViewCell
|
||||||
{
|
{
|
||||||
let imageView: UIImageView
|
let imageView = UIImageView(image: nil)
|
||||||
|
|
||||||
|
override init(frame: CGRect)
|
||||||
|
{
|
||||||
|
super.init(frame: frame)
|
||||||
|
|
||||||
|
self.initialize()
|
||||||
|
}
|
||||||
|
|
||||||
required init?(coder aDecoder: NSCoder)
|
required init?(coder aDecoder: NSCoder)
|
||||||
{
|
{
|
||||||
self.imageView = UIImageView(image: nil)
|
|
||||||
self.imageView.layer.masksToBounds = true
|
|
||||||
|
|
||||||
super.init(coder: aDecoder)
|
super.init(coder: aDecoder)
|
||||||
|
|
||||||
|
self.initialize()
|
||||||
|
}
|
||||||
|
|
||||||
|
private func initialize()
|
||||||
|
{
|
||||||
|
self.imageView.layer.masksToBounds = true
|
||||||
self.addSubview(self.imageView, pinningEdgesWith: .zero)
|
self.addSubview(self.imageView, pinningEdgesWith: .zero)
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -29,14 +39,6 @@ class ScreenshotCollectionViewCell: UICollectionViewCell
|
|||||||
{
|
{
|
||||||
super.layoutSubviews()
|
super.layoutSubviews()
|
||||||
|
|
||||||
if let image = self.imageView.image, (image.size.height / image.size.width) > ((16.0 / 9.0) + 0.1)
|
self.imageView.layer.cornerRadius = 4
|
||||||
{
|
|
||||||
// Image aspect ratio is taller than 16:9, so assume it's an X-style screenshot and set corner radius.
|
|
||||||
self.imageView.layer.cornerRadius = max(self.imageView.bounds.width / 9.8, 8)
|
|
||||||
}
|
|
||||||
else
|
|
||||||
{
|
|
||||||
self.imageView.layer.cornerRadius = 0
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
Reference in New Issue
Block a user