mirror of
https://github.com/SideStore/SideStore.git
synced 2026-02-09 06:43:25 +01:00
Adds AddSourceViewController to add sources by URL or from list of recommended sources
This commit is contained in:
93
AltStore/Sources/Components/AddSourceTextFieldCell.swift
Normal file
93
AltStore/Sources/Components/AddSourceTextFieldCell.swift
Normal file
@@ -0,0 +1,93 @@
|
||||
//
|
||||
// AddSourceTextFieldCell.swift
|
||||
// AltStore
|
||||
//
|
||||
// Created by Riley Testut on 10/17/23.
|
||||
// Copyright © 2023 Riley Testut. All rights reserved.
|
||||
//
|
||||
|
||||
import UIKit
|
||||
|
||||
class AddSourceTextFieldCell: UICollectionViewCell
|
||||
{
|
||||
let textField: UITextField
|
||||
|
||||
private let backgroundEffectView: UIVisualEffectView
|
||||
private let imageView: UIImageView
|
||||
|
||||
override init(frame: CGRect)
|
||||
{
|
||||
self.textField = UITextField(frame: frame)
|
||||
self.textField.translatesAutoresizingMaskIntoConstraints = false
|
||||
self.textField.placeholder = "apps.altstore.io"
|
||||
self.textField.textContentType = .URL
|
||||
self.textField.keyboardType = .URL
|
||||
self.textField.returnKeyType = .done
|
||||
self.textField.autocapitalizationType = .none
|
||||
self.textField.autocorrectionType = .no
|
||||
self.textField.spellCheckingType = .no
|
||||
self.textField.enablesReturnKeyAutomatically = true
|
||||
self.textField.tintColor = .altPrimary
|
||||
self.textField.textColor = UIColor { traits in
|
||||
if traits.userInterfaceStyle == .dark
|
||||
{
|
||||
//TODO: Change once we update UIColor.altPrimary to match 2.0 icon.
|
||||
return UIColor(resource: .gradientTop)
|
||||
}
|
||||
else
|
||||
{
|
||||
return UIColor.altPrimary
|
||||
}
|
||||
}
|
||||
|
||||
let blurEffect = UIBlurEffect(style: .systemChromeMaterial)
|
||||
self.backgroundEffectView = UIVisualEffectView(effect: blurEffect)
|
||||
self.backgroundEffectView.translatesAutoresizingMaskIntoConstraints = false
|
||||
self.backgroundEffectView.clipsToBounds = true
|
||||
self.backgroundEffectView.backgroundColor = .altPrimary
|
||||
|
||||
let config = UIImage.SymbolConfiguration(pointSize: 20, weight: .bold)
|
||||
let image = UIImage(systemName: "link", withConfiguration: config)?.withRenderingMode(.alwaysTemplate)
|
||||
self.imageView = UIImageView(image: image)
|
||||
self.imageView.translatesAutoresizingMaskIntoConstraints = false
|
||||
self.imageView.contentMode = .center
|
||||
self.imageView.tintColor = .altPrimary
|
||||
|
||||
super.init(frame: frame)
|
||||
|
||||
self.contentView.preservesSuperviewLayoutMargins = true
|
||||
|
||||
self.backgroundEffectView.contentView.addSubview(self.imageView)
|
||||
self.backgroundEffectView.contentView.addSubview(self.textField)
|
||||
self.contentView.addSubview(self.backgroundEffectView)
|
||||
|
||||
NSLayoutConstraint.activate([
|
||||
self.backgroundEffectView.leadingAnchor.constraint(equalTo: self.contentView.layoutMarginsGuide.leadingAnchor),
|
||||
self.backgroundEffectView.trailingAnchor.constraint(equalTo: self.contentView.layoutMarginsGuide.trailingAnchor),
|
||||
self.backgroundEffectView.topAnchor.constraint(equalTo: self.contentView.topAnchor),
|
||||
self.backgroundEffectView.bottomAnchor.constraint(equalTo: self.contentView.bottomAnchor),
|
||||
|
||||
self.imageView.widthAnchor.constraint(equalToConstant: 44),
|
||||
self.imageView.heightAnchor.constraint(equalToConstant: 44),
|
||||
self.imageView.centerYAnchor.constraint(equalTo: self.backgroundEffectView.centerYAnchor),
|
||||
|
||||
self.textField.topAnchor.constraint(equalTo: self.backgroundEffectView.topAnchor, constant: 15),
|
||||
self.textField.bottomAnchor.constraint(equalTo: self.backgroundEffectView.bottomAnchor, constant: -15),
|
||||
self.textField.trailingAnchor.constraint(equalTo: self.backgroundEffectView.trailingAnchor, constant: -15),
|
||||
|
||||
self.imageView.leadingAnchor.constraint(equalTo: self.backgroundEffectView.leadingAnchor, constant: 15),
|
||||
self.textField.leadingAnchor.constraint(equalToSystemSpacingAfter: self.imageView.trailingAnchor, multiplier: 1.0),
|
||||
])
|
||||
}
|
||||
|
||||
required init?(coder: NSCoder) {
|
||||
fatalError("init(coder:) has not been implemented")
|
||||
}
|
||||
|
||||
override func layoutSubviews()
|
||||
{
|
||||
super.layoutSubviews()
|
||||
|
||||
self.backgroundEffectView.layer.cornerRadius = self.backgroundEffectView.bounds.midY
|
||||
}
|
||||
}
|
||||
113
AltStore/Sources/Components/SourceComponents.swift
Normal file
113
AltStore/Sources/Components/SourceComponents.swift
Normal file
@@ -0,0 +1,113 @@
|
||||
//
|
||||
// SourceDetailsComponents.swift
|
||||
// AltStore
|
||||
//
|
||||
// Created by Riley Testut on 3/16/23.
|
||||
// Copyright © 2023 Riley Testut. All rights reserved.
|
||||
//
|
||||
|
||||
import UIKit
|
||||
|
||||
import Roxas
|
||||
|
||||
class TitleCollectionReusableView: UICollectionReusableView
|
||||
{
|
||||
let label: UILabel
|
||||
|
||||
override init(frame: CGRect)
|
||||
{
|
||||
let fontDescriptor = UIFontDescriptor.preferredFontDescriptor(withTextStyle: .largeTitle).withSymbolicTraits(.traitBold)!
|
||||
let font = UIFont(descriptor: fontDescriptor, size: 0.0)
|
||||
|
||||
self.label = UILabel(frame: .zero)
|
||||
self.label.font = font
|
||||
|
||||
super.init(frame: frame)
|
||||
|
||||
self.addSubview(self.label, pinningEdgesWith: .zero)
|
||||
}
|
||||
|
||||
required init?(coder: NSCoder) {
|
||||
fatalError("init(coder:) has not been implemented")
|
||||
}
|
||||
}
|
||||
|
||||
class ButtonCollectionReusableView: UICollectionReusableView
|
||||
{
|
||||
let button: UIButton
|
||||
|
||||
override init(frame: CGRect)
|
||||
{
|
||||
self.button = UIButton(type: .system)
|
||||
self.button.translatesAutoresizingMaskIntoConstraints = false
|
||||
|
||||
super.init(frame: frame)
|
||||
|
||||
self.addSubview(self.button, pinningEdgesWith: .zero)
|
||||
}
|
||||
|
||||
required init?(coder: NSCoder) {
|
||||
fatalError("init(coder:) has not been implemented")
|
||||
}
|
||||
}
|
||||
|
||||
class TextViewCollectionViewCell: UICollectionViewCell
|
||||
{
|
||||
let textView = CollapsingTextView(frame: .zero)
|
||||
|
||||
override init(frame: CGRect)
|
||||
{
|
||||
super.init(frame: frame)
|
||||
|
||||
self.initialize()
|
||||
}
|
||||
|
||||
required init?(coder: NSCoder)
|
||||
{
|
||||
super.init(coder: coder)
|
||||
|
||||
self.initialize()
|
||||
}
|
||||
|
||||
private func initialize()
|
||||
{
|
||||
self.textView.font = UIFont.preferredFont(forTextStyle: .body)
|
||||
self.textView.isScrollEnabled = false
|
||||
self.textView.isEditable = false
|
||||
self.textView.isSelectable = true
|
||||
self.textView.dataDetectorTypes = [.link]
|
||||
self.contentView.addSubview(self.textView, pinningEdgesWith: .zero)
|
||||
}
|
||||
|
||||
override func layoutMarginsDidChange()
|
||||
{
|
||||
super.layoutMarginsDidChange()
|
||||
|
||||
self.textView.textContainerInset.left = self.contentView.layoutMargins.left
|
||||
self.textView.textContainerInset.right = self.contentView.layoutMargins.right
|
||||
}
|
||||
}
|
||||
|
||||
class PlaceholderCollectionReusableView: UICollectionReusableView
|
||||
{
|
||||
let placeholderView: RSTPlaceholderView
|
||||
|
||||
override init(frame: CGRect)
|
||||
{
|
||||
self.placeholderView = RSTPlaceholderView(frame: .zero)
|
||||
self.placeholderView.activityIndicatorView.style = .medium
|
||||
|
||||
super.init(frame: frame)
|
||||
|
||||
self.addSubview(self.placeholderView, pinningEdgesWith: .zero)
|
||||
|
||||
NSLayoutConstraint.activate([
|
||||
self.placeholderView.stackView.topAnchor.constraint(equalTo: self.placeholderView.topAnchor),
|
||||
self.placeholderView.stackView.bottomAnchor.constraint(equalTo: self.placeholderView.bottomAnchor),
|
||||
])
|
||||
}
|
||||
|
||||
required init?(coder: NSCoder) {
|
||||
fatalError("init(coder:) has not been implemented")
|
||||
}
|
||||
}
|
||||
106
AltStore/Sources/Components/SourceHeaderView.swift
Normal file
106
AltStore/Sources/Components/SourceHeaderView.swift
Normal file
@@ -0,0 +1,106 @@
|
||||
//
|
||||
// SourceHeaderView.swift
|
||||
// AltStore
|
||||
//
|
||||
// Created by Riley Testut on 3/9/23.
|
||||
// Copyright © 2023 Riley Testut. All rights reserved.
|
||||
//
|
||||
|
||||
import UIKit
|
||||
|
||||
import AltStoreCore
|
||||
import Roxas
|
||||
|
||||
import Nuke
|
||||
|
||||
class SourceHeaderView: RSTNibView
|
||||
{
|
||||
@IBOutlet private(set) var titleLabel: UILabel!
|
||||
@IBOutlet private(set) var subtitleLabel: UILabel!
|
||||
@IBOutlet private(set) var iconImageView: UIImageView!
|
||||
@IBOutlet private(set) var websiteButton: UIButton!
|
||||
|
||||
@IBOutlet private var websiteContentView: UIView!
|
||||
@IBOutlet private var websiteButtonContainerView: UIView!
|
||||
@IBOutlet private var websiteImageView: UIImageView!
|
||||
|
||||
@IBOutlet private var widthConstraint: NSLayoutConstraint!
|
||||
|
||||
override init(frame: CGRect)
|
||||
{
|
||||
super.init(frame: frame)
|
||||
|
||||
self.initialize()
|
||||
}
|
||||
|
||||
required init?(coder: NSCoder)
|
||||
{
|
||||
super.init(coder: coder)
|
||||
|
||||
self.initialize()
|
||||
}
|
||||
|
||||
private func initialize()
|
||||
{
|
||||
self.clipsToBounds = true
|
||||
self.layer.cornerRadius = 22
|
||||
|
||||
self.iconImageView.clipsToBounds = true
|
||||
|
||||
let fontDescriptor = UIFontDescriptor.preferredFontDescriptor(withTextStyle: .title3).withSymbolicTraits(.traitBold)!
|
||||
let titleFont = UIFont(descriptor: fontDescriptor, size: 0.0)
|
||||
self.titleLabel.font = titleFont
|
||||
|
||||
self.websiteButton.setTitle(nil, for: .normal)
|
||||
self.websiteButton.titleLabel?.font = UIFont.preferredFont(forTextStyle: .subheadline)
|
||||
|
||||
let imageConfiguration = UIImage.SymbolConfiguration(scale: .medium)
|
||||
let websiteImage = UIImage(systemName: "link", withConfiguration: imageConfiguration)
|
||||
self.websiteImageView.image = websiteImage
|
||||
|
||||
self.websiteButtonContainerView.clipsToBounds = true
|
||||
self.websiteButtonContainerView.layer.cornerRadius = 14 // 22 - inset (8)
|
||||
}
|
||||
|
||||
override func layoutSubviews()
|
||||
{
|
||||
super.layoutSubviews()
|
||||
|
||||
self.iconImageView.layer.cornerRadius = self.iconImageView.bounds.midY
|
||||
|
||||
if let titleLabel = self.websiteButton.titleLabel, self.widthConstraint.constant == 0
|
||||
{
|
||||
// Left-align website button text with subtitle by increasing width by label inset.
|
||||
let frame = self.websiteButton.convert(titleLabel.frame, from: titleLabel.superview)
|
||||
self.widthConstraint.constant = frame.minX
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
extension SourceHeaderView
|
||||
{
|
||||
func configure(for source: Source)
|
||||
{
|
||||
self.titleLabel.text = source.name
|
||||
self.subtitleLabel.text = source.subtitle
|
||||
|
||||
self.websiteImageView.tintColor = source.effectiveTintColor
|
||||
|
||||
if let websiteURL = source.websiteURL
|
||||
{
|
||||
self.websiteButton.setTitle(websiteURL.absoluteString, for: .normal)
|
||||
|
||||
self.websiteContentView.isHidden = false
|
||||
self.websiteImageView.isHidden = false
|
||||
}
|
||||
else
|
||||
{
|
||||
self.websiteButton.setTitle(nil, for: .normal)
|
||||
|
||||
self.websiteContentView.isHidden = true
|
||||
self.websiteImageView.isHidden = true
|
||||
}
|
||||
|
||||
Nuke.loadImage(with: source.effectiveIconURL, into: self.iconImageView)
|
||||
}
|
||||
}
|
||||
206
AltStore/Sources/Components/SourceHeaderView.xib
Normal file
206
AltStore/Sources/Components/SourceHeaderView.xib
Normal file
@@ -0,0 +1,206 @@
|
||||
<?xml version="1.0" encoding="UTF-8"?>
|
||||
<document type="com.apple.InterfaceBuilder3.CocoaTouch.XIB" version="3.0" toolsVersion="21507" targetRuntime="iOS.CocoaTouch" propertyAccessControl="none" useAutolayout="YES" useTraitCollections="YES" useSafeAreas="YES" colorMatched="YES">
|
||||
<device id="retina6_12" orientation="portrait" appearance="light"/>
|
||||
<dependencies>
|
||||
<deployment identifier="iOS"/>
|
||||
<plugIn identifier="com.apple.InterfaceBuilder.IBCocoaTouchPlugin" version="21505"/>
|
||||
<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"/>
|
||||
</dependencies>
|
||||
<objects>
|
||||
<placeholder placeholderIdentifier="IBFilesOwner" id="-1" userLabel="File's Owner" customClass="SourceHeaderView" customModule="AltStore" customModuleProvider="target">
|
||||
<connections>
|
||||
<outlet property="iconImageView" destination="rfC-wI-8JY" id="1FW-GN-WDa"/>
|
||||
<outlet property="subtitleLabel" destination="IUL-qI-QAg" id="RyD-ax-OtJ"/>
|
||||
<outlet property="titleLabel" destination="FsG-Wm-6xP" id="huW-re-9G0"/>
|
||||
<outlet property="websiteButton" destination="cDF-t8-8Ri" id="6YC-OT-StI"/>
|
||||
<outlet property="websiteButtonContainerView" destination="kyG-Ne-9eG" id="eH9-eb-iEe"/>
|
||||
<outlet property="websiteContentView" destination="lLy-42-4bf" id="sUV-gS-ykd"/>
|
||||
<outlet property="websiteImageView" destination="Vd9-Y3-Vhc" id="vvT-Wx-o8o"/>
|
||||
<outlet property="widthConstraint" destination="KPO-2J-5Pt" id="o0i-tJ-88g"/>
|
||||
</connections>
|
||||
</placeholder>
|
||||
<placeholder placeholderIdentifier="IBFirstResponder" id="-2" customClass="UIResponder"/>
|
||||
<view opaque="NO" clipsSubviews="YES" multipleTouchEnabled="YES" contentMode="center" insetsLayoutMarginsFromSafeArea="NO" id="ed2-hy-JkU">
|
||||
<rect key="frame" x="0.0" y="0.0" width="375" height="400"/>
|
||||
<autoresizingMask key="autoresizingMask" widthSizable="YES" heightSizable="YES"/>
|
||||
<subviews>
|
||||
<visualEffectView opaque="NO" contentMode="scaleToFill" insetsLayoutMarginsFromSafeArea="NO" translatesAutoresizingMaskIntoConstraints="NO" id="VTh-Dz-qVQ" userLabel="Blur View">
|
||||
<rect key="frame" x="0.0" y="0.0" width="375" height="400"/>
|
||||
<view key="contentView" opaque="NO" clipsSubviews="YES" multipleTouchEnabled="YES" contentMode="center" insetsLayoutMarginsFromSafeArea="NO" id="eHD-cD-5y4">
|
||||
<rect key="frame" x="0.0" y="0.0" width="375" height="400"/>
|
||||
<autoresizingMask key="autoresizingMask" widthSizable="YES" heightSizable="YES"/>
|
||||
<subviews>
|
||||
<stackView opaque="NO" contentMode="scaleToFill" insetsLayoutMarginsFromSafeArea="NO" axis="vertical" distribution="equalSpacing" spacing="14" translatesAutoresizingMaskIntoConstraints="NO" id="Ydv-2n-m56">
|
||||
<rect key="frame" x="0.0" y="0.0" width="375" height="400"/>
|
||||
<subviews>
|
||||
<stackView opaque="NO" contentMode="scaleToFill" preservesSuperviewLayoutMargins="YES" insetsLayoutMarginsFromSafeArea="NO" alignment="center" spacing="11" translatesAutoresizingMaskIntoConstraints="NO" id="hfp-yJ-gcH" userLabel="App Info">
|
||||
<rect key="frame" x="14" y="14" width="349" height="68"/>
|
||||
<subviews>
|
||||
<imageView clipsSubviews="YES" userInteractionEnabled="NO" contentMode="scaleAspectFit" horizontalHuggingPriority="251" verticalHuggingPriority="251" translatesAutoresizingMaskIntoConstraints="NO" id="rfC-wI-8JY" userLabel="Icon Image View">
|
||||
<rect key="frame" x="0.0" y="0.0" width="68" height="68"/>
|
||||
<constraints>
|
||||
<constraint firstAttribute="width" secondItem="rfC-wI-8JY" secondAttribute="height" multiplier="1:1" id="Pec-Vt-SX1"/>
|
||||
<constraint firstAttribute="height" constant="68" id="enw-jt-m0C"/>
|
||||
</constraints>
|
||||
</imageView>
|
||||
<stackView opaque="NO" contentMode="scaleToFill" verticalHuggingPriority="100" insetsLayoutMarginsFromSafeArea="NO" axis="vertical" alignment="top" spacing="4" translatesAutoresizingMaskIntoConstraints="NO" id="a5P-5y-U64" userLabel="Labels Stack View">
|
||||
<rect key="frame" x="79" y="10.000000000000004" width="270" height="48.333333333333343"/>
|
||||
<subviews>
|
||||
<label opaque="NO" userInteractionEnabled="NO" contentMode="left" horizontalHuggingPriority="100" verticalHuggingPriority="251" horizontalCompressionResistancePriority="500" text="Source Name" textAlignment="natural" lineBreakMode="tailTruncation" baselineAdjustment="alignBaselines" minimumScaleFactor="0.5" translatesAutoresizingMaskIntoConstraints="NO" id="FsG-Wm-6xP">
|
||||
<rect key="frame" x="0.0" y="0.0" width="128.66666666666666" height="26.333333333333332"/>
|
||||
<accessibility key="accessibilityConfiguration" identifier="NameLabel"/>
|
||||
<fontDescription key="fontDescription" style="UICTFontTextStyleTitle2"/>
|
||||
<nil key="textColor"/>
|
||||
<nil key="highlightedColor"/>
|
||||
</label>
|
||||
<visualEffectView opaque="NO" contentMode="scaleToFill" translatesAutoresizingMaskIntoConstraints="NO" id="7WA-03-aKF" userLabel="Vibrancy View">
|
||||
<rect key="frame" x="0.0" y="30.333333333333336" width="95" height="18"/>
|
||||
<view key="contentView" opaque="NO" clipsSubviews="YES" multipleTouchEnabled="YES" contentMode="center" insetsLayoutMarginsFromSafeArea="NO" id="ie4-Od-obh">
|
||||
<rect key="frame" x="0.0" y="0.0" width="95" height="18"/>
|
||||
<autoresizingMask key="autoresizingMask" widthSizable="YES" heightSizable="YES"/>
|
||||
<subviews>
|
||||
<label opaque="NO" userInteractionEnabled="NO" contentMode="left" horizontalHuggingPriority="100" verticalHuggingPriority="750" text="Subtitle" textAlignment="natural" lineBreakMode="tailTruncation" numberOfLines="2" baselineAdjustment="alignBaselines" minimumScaleFactor="0.5" translatesAutoresizingMaskIntoConstraints="NO" id="IUL-qI-QAg">
|
||||
<rect key="frame" x="0.0" y="0.0" width="95" height="18"/>
|
||||
<fontDescription key="fontDescription" style="UICTFontTextStyleSubhead"/>
|
||||
<color key="textColor" white="1" alpha="1" colorSpace="custom" customColorSpace="genericGamma22GrayColorSpace"/>
|
||||
<nil key="highlightedColor"/>
|
||||
</label>
|
||||
</subviews>
|
||||
<constraints>
|
||||
<constraint firstItem="IUL-qI-QAg" firstAttribute="top" secondItem="ie4-Od-obh" secondAttribute="top" id="3YV-ax-2UB"/>
|
||||
<constraint firstAttribute="trailing" secondItem="IUL-qI-QAg" secondAttribute="trailing" id="PFG-Oe-76p"/>
|
||||
<constraint firstAttribute="bottom" secondItem="IUL-qI-QAg" secondAttribute="bottom" id="Q0z-A4-UhM"/>
|
||||
<constraint firstItem="IUL-qI-QAg" firstAttribute="leading" secondItem="ie4-Od-obh" secondAttribute="leading" id="qjX-ro-UD6"/>
|
||||
</constraints>
|
||||
</view>
|
||||
<vibrancyEffect style="secondaryLabel">
|
||||
<blurEffect style="systemThinMaterial"/>
|
||||
</vibrancyEffect>
|
||||
</visualEffectView>
|
||||
</subviews>
|
||||
</stackView>
|
||||
</subviews>
|
||||
</stackView>
|
||||
<stackView opaque="NO" contentMode="scaleToFill" translatesAutoresizingMaskIntoConstraints="NO" id="lLy-42-4bf" userLabel="Website">
|
||||
<rect key="frame" x="14" y="336" width="349" height="50"/>
|
||||
<subviews>
|
||||
<view contentMode="scaleToFill" translatesAutoresizingMaskIntoConstraints="NO" id="bl1-oP-fLT" userLabel="Spacer View">
|
||||
<rect key="frame" x="0.0" y="0.0" width="349" height="50"/>
|
||||
<subviews>
|
||||
<imageView clipsSubviews="YES" userInteractionEnabled="NO" contentMode="center" horizontalHuggingPriority="251" verticalHuggingPriority="251" placeholderIntrinsicWidth="44" placeholderIntrinsicHeight="44" translatesAutoresizingMaskIntoConstraints="NO" id="Vd9-Y3-Vhc">
|
||||
<rect key="frame" x="12" y="3" width="44" height="44"/>
|
||||
</imageView>
|
||||
<view contentMode="scaleToFill" insetsLayoutMarginsFromSafeArea="NO" translatesAutoresizingMaskIntoConstraints="NO" id="kyG-Ne-9eG" userLabel="Website Button Container View">
|
||||
<rect key="frame" x="79" y="0.0" width="270" height="50"/>
|
||||
<subviews>
|
||||
<visualEffectView opaque="NO" contentMode="scaleToFill" preservesSuperviewLayoutMargins="YES" translatesAutoresizingMaskIntoConstraints="NO" id="c6g-CV-IeK" userLabel="Vibrancy View">
|
||||
<rect key="frame" x="0.0" y="0.0" width="270" height="50"/>
|
||||
<view key="contentView" opaque="NO" clipsSubviews="YES" multipleTouchEnabled="YES" contentMode="center" insetsLayoutMarginsFromSafeArea="NO" id="zhu-r0-cL8">
|
||||
<rect key="frame" x="0.0" y="0.0" width="270" height="50"/>
|
||||
<autoresizingMask key="autoresizingMask" widthSizable="YES" heightSizable="YES"/>
|
||||
<subviews>
|
||||
<button opaque="NO" contentMode="scaleToFill" contentHorizontalAlignment="left" contentVerticalAlignment="center" buttonType="system" lineBreakMode="middleTruncation" translatesAutoresizingMaskIntoConstraints="NO" id="1lg-Ki-MOK">
|
||||
<rect key="frame" x="0.0" y="0.0" width="270" height="50"/>
|
||||
<color key="backgroundColor" white="1" alpha="0.20000000000000001" colorSpace="custom" customColorSpace="genericGamma22GrayColorSpace"/>
|
||||
<inset key="imageEdgeInsets" minX="0.0" minY="0.0" maxX="2.2250738585072014e-308" maxY="0.0"/>
|
||||
<state key="normal" title=" "/>
|
||||
<buttonConfiguration key="configuration" style="plain" title=" "/>
|
||||
</button>
|
||||
</subviews>
|
||||
<constraints>
|
||||
<constraint firstAttribute="bottom" secondItem="1lg-Ki-MOK" secondAttribute="bottom" id="2Xf-5H-MQm"/>
|
||||
<constraint firstItem="1lg-Ki-MOK" firstAttribute="top" secondItem="zhu-r0-cL8" secondAttribute="top" id="PIj-oh-hQg"/>
|
||||
<constraint firstAttribute="trailing" secondItem="1lg-Ki-MOK" secondAttribute="trailing" id="f2H-jO-d5v"/>
|
||||
<constraint firstItem="1lg-Ki-MOK" firstAttribute="leading" secondItem="zhu-r0-cL8" secondAttribute="leading" id="zdh-qf-8ow"/>
|
||||
</constraints>
|
||||
</view>
|
||||
<vibrancyEffect style="secondaryFill">
|
||||
<blurEffect style="systemThinMaterial"/>
|
||||
</vibrancyEffect>
|
||||
</visualEffectView>
|
||||
<visualEffectView opaque="NO" contentMode="scaleToFill" preservesSuperviewLayoutMargins="YES" translatesAutoresizingMaskIntoConstraints="NO" id="Sgm-uO-rMs" userLabel="Vibrancy View">
|
||||
<rect key="frame" x="0.0" y="0.0" width="270" height="50"/>
|
||||
<view key="contentView" opaque="NO" clipsSubviews="YES" multipleTouchEnabled="YES" contentMode="center" insetsLayoutMarginsFromSafeArea="NO" id="6e6-8c-O5P">
|
||||
<rect key="frame" x="0.0" y="0.0" width="270" height="50"/>
|
||||
<autoresizingMask key="autoresizingMask" widthSizable="YES" heightSizable="YES"/>
|
||||
<subviews>
|
||||
<button opaque="NO" contentMode="scaleToFill" contentHorizontalAlignment="left" contentVerticalAlignment="center" buttonType="system" lineBreakMode="middleTruncation" translatesAutoresizingMaskIntoConstraints="NO" id="cDF-t8-8Ri">
|
||||
<rect key="frame" x="0.0" y="0.0" width="270" height="50"/>
|
||||
<inset key="imageEdgeInsets" minX="0.0" minY="0.0" maxX="2.2250738585072014e-308" maxY="0.0"/>
|
||||
<state key="normal" title="https://rileytestut.com"/>
|
||||
<buttonConfiguration key="configuration" style="plain" title="https://rileytestut.com"/>
|
||||
</button>
|
||||
</subviews>
|
||||
<constraints>
|
||||
<constraint firstItem="cDF-t8-8Ri" firstAttribute="leading" secondItem="6e6-8c-O5P" secondAttribute="leading" id="9pW-be-mEO"/>
|
||||
<constraint firstAttribute="bottom" secondItem="cDF-t8-8Ri" secondAttribute="bottom" id="9zM-Hq-5ea"/>
|
||||
<constraint firstItem="cDF-t8-8Ri" firstAttribute="top" secondItem="6e6-8c-O5P" secondAttribute="top" id="RW7-Qu-Afy"/>
|
||||
<constraint firstAttribute="trailing" secondItem="cDF-t8-8Ri" secondAttribute="trailing" id="sln-aP-Czq"/>
|
||||
</constraints>
|
||||
</view>
|
||||
<vibrancyEffect style="fill">
|
||||
<blurEffect style="systemThinMaterial"/>
|
||||
</vibrancyEffect>
|
||||
</visualEffectView>
|
||||
</subviews>
|
||||
<constraints>
|
||||
<constraint firstAttribute="trailing" secondItem="c6g-CV-IeK" secondAttribute="trailing" id="2Db-8d-4ta"/>
|
||||
<constraint firstAttribute="bottom" secondItem="Sgm-uO-rMs" secondAttribute="bottom" id="CuL-oW-Tka"/>
|
||||
<constraint firstItem="c6g-CV-IeK" firstAttribute="leading" secondItem="kyG-Ne-9eG" secondAttribute="leading" id="Wey-l1-VIN"/>
|
||||
<constraint firstItem="Sgm-uO-rMs" firstAttribute="leading" secondItem="kyG-Ne-9eG" secondAttribute="leading" id="Zca-A9-Z3v"/>
|
||||
<constraint firstItem="Sgm-uO-rMs" firstAttribute="top" secondItem="kyG-Ne-9eG" secondAttribute="top" id="aLc-Sh-C2g"/>
|
||||
<constraint firstItem="c6g-CV-IeK" firstAttribute="top" secondItem="kyG-Ne-9eG" secondAttribute="top" id="gL7-rP-JJQ"/>
|
||||
<constraint firstAttribute="bottom" secondItem="c6g-CV-IeK" secondAttribute="bottom" id="h1Q-x5-7ch"/>
|
||||
<constraint firstAttribute="trailing" secondItem="Sgm-uO-rMs" secondAttribute="trailing" id="hgG-mP-CiI"/>
|
||||
</constraints>
|
||||
</view>
|
||||
</subviews>
|
||||
<constraints>
|
||||
<constraint firstItem="kyG-Ne-9eG" firstAttribute="top" secondItem="bl1-oP-fLT" secondAttribute="top" id="4WU-ym-LUr"/>
|
||||
<constraint firstAttribute="bottom" secondItem="kyG-Ne-9eG" secondAttribute="bottom" id="9Md-8N-jr9"/>
|
||||
<constraint firstItem="Vd9-Y3-Vhc" firstAttribute="centerY" secondItem="kyG-Ne-9eG" secondAttribute="centerY" id="kd3-l3-vD7"/>
|
||||
<constraint firstAttribute="trailing" secondItem="kyG-Ne-9eG" secondAttribute="trailing" id="mCi-EJ-bcd"/>
|
||||
</constraints>
|
||||
</view>
|
||||
</subviews>
|
||||
</stackView>
|
||||
</subviews>
|
||||
<constraints>
|
||||
<constraint firstAttribute="trailingMargin" secondItem="hfp-yJ-gcH" secondAttribute="trailing" id="9R7-eh-OeE"/>
|
||||
<constraint firstItem="kyG-Ne-9eG" firstAttribute="width" secondItem="a5P-5y-U64" secondAttribute="width" id="KPO-2J-5Pt"/>
|
||||
<constraint firstItem="Vd9-Y3-Vhc" firstAttribute="centerX" secondItem="rfC-wI-8JY" secondAttribute="centerX" id="TtS-ai-grE"/>
|
||||
<constraint firstAttribute="leadingMargin" secondItem="hfp-yJ-gcH" secondAttribute="leading" id="YPF-kW-MKJ"/>
|
||||
</constraints>
|
||||
<edgeInsets key="layoutMargins" top="14" left="14" bottom="14" right="12"/>
|
||||
</stackView>
|
||||
</subviews>
|
||||
<color key="backgroundColor" name="BlurTint"/>
|
||||
<constraints>
|
||||
<constraint firstItem="Ydv-2n-m56" firstAttribute="leading" secondItem="eHD-cD-5y4" secondAttribute="leading" id="FdZ-7R-70D"/>
|
||||
<constraint firstItem="Ydv-2n-m56" firstAttribute="top" secondItem="eHD-cD-5y4" secondAttribute="top" id="JtX-k9-9A3"/>
|
||||
<constraint firstAttribute="bottom" secondItem="Ydv-2n-m56" secondAttribute="bottom" id="X2R-Ab-m7o"/>
|
||||
<constraint firstAttribute="trailing" secondItem="Ydv-2n-m56" secondAttribute="trailing" id="z0g-5Q-eso"/>
|
||||
</constraints>
|
||||
</view>
|
||||
<blurEffect style="systemThinMaterial"/>
|
||||
</visualEffectView>
|
||||
</subviews>
|
||||
<viewLayoutGuide key="safeArea" id="jw2-Uc-PZa"/>
|
||||
<constraints>
|
||||
<constraint firstItem="VTh-Dz-qVQ" firstAttribute="top" secondItem="ed2-hy-JkU" secondAttribute="top" id="2oR-Up-r2e"/>
|
||||
<constraint firstAttribute="bottom" secondItem="VTh-Dz-qVQ" secondAttribute="bottom" id="4bb-e5-tea"/>
|
||||
<constraint firstItem="VTh-Dz-qVQ" firstAttribute="leading" secondItem="ed2-hy-JkU" secondAttribute="leading" id="aZg-21-M6I"/>
|
||||
<constraint firstAttribute="trailing" secondItem="VTh-Dz-qVQ" secondAttribute="trailing" id="o4u-HT-CZ6"/>
|
||||
</constraints>
|
||||
<freeformSimulatedSizeMetrics key="simulatedDestinationMetrics"/>
|
||||
<point key="canvasLocation" x="266" y="135"/>
|
||||
</view>
|
||||
</objects>
|
||||
<resources>
|
||||
<namedColor name="BlurTint">
|
||||
<color red="1" green="1" blue="1" alpha="0.30000001192092896" colorSpace="custom" customColorSpace="sRGB"/>
|
||||
</namedColor>
|
||||
</resources>
|
||||
</document>
|
||||
Reference in New Issue
Block a user