Manos Chorianopoulos

MyRewardsProfileInfoTableViewCell redesign

......@@ -13,107 +13,144 @@ protocol MyRewardsProfileInfoTableViewCellDelegate: AnyObject {
@objc(MyRewardsProfileInfoTableViewCell)
public class MyRewardsProfileInfoTableViewCell: UITableViewCell {
@IBOutlet weak var tagView1: UIView!
@IBOutlet weak var tagLabel1: UILabel!
@IBOutlet weak var tagView2: UIView!
@IBOutlet weak var tagLabel2: UILabel!
@IBOutlet weak var profileImage: UIImageView!
// MARK: - IBOutlets
/// Bold "Rewards" title label (top-left)
@IBOutlet weak var titleLabel: UILabel!
/// Horizontally scrollable container for tag pills
@IBOutlet weak var tagsScrollView: UIScrollView!
/// Horizontal stack view inside the scroll view; tag pill views are added here dynamically
@IBOutlet weak var tagsStackView: UIStackView!
/// Settings / gear button (top-right)
@IBOutlet weak var profileButton: UIButton!
// MARK: - Delegate
weak var delegate: MyRewardsProfileInfoTableViewCellDelegate?
// MARK: - Properties
// MARK: - Private
private var profileModel: ProfileModel?
// MARK: - Lifecycle
public override func awakeFromNib() {
super.awakeFromNib()
// Initialization code
profileImage.image = UIImage(named: "profile_pic_default", in: Bundle.frameworkResourceBundle, compatibleWith: nil)
selectionStyle = .none
// Title
titleLabel.font = UIFont(name: "PingLCG-Bold", size: 26)
?? UIFont.boldSystemFont(ofSize: 26)
titleLabel.textColor = UIColor(rgb: 0x1D2023)
titleLabel.text = "Rewards"
// Gear button: render image as-is (no tint) so the gray circle style is preserved
let gearImage = UIImage(named: "settings_circle", in: Bundle.frameworkResourceBundle, compatibleWith: nil)?
.withRenderingMode(.alwaysOriginal)
profileButton.setImage(gearImage, for: .normal)
profileButton.setTitle("", for: .normal)
profileButton.addTarget(self, action: #selector(profileButtonTapped), for: .touchUpInside)
tagView1.backgroundColor = UIColor(rgb: 0x09914E)
tagView1.layer.cornerRadius = 4.0
tagLabel1.font = UIFont(name: "PingLCG-Regular", size: 17)
tagLabel1.textColor = UIColor(rgb: 0xFFFFFF)
tagView2.backgroundColor = UIColor(rgb: 0xFC9F25)
tagView2.layer.cornerRadius = 4.0
tagLabel2.font = UIFont(name: "PingLCG-Regular", size: 17)
tagLabel2.textColor = UIColor(rgb: 0xFFFFFF)
// Tags scroll view
tagsScrollView.showsHorizontalScrollIndicator = false
tagsScrollView.showsVerticalScrollIndicator = false
// Tags stack view
tagsStackView.axis = .horizontal
tagsStackView.spacing = 9
tagsStackView.alignment = .center
tagsStackView.distribution = .fill
}
public override func setSelected(_ selected: Bool, animated: Bool) {
super.setSelected(selected, animated: animated)
}
// Configure the view for the selected state
public override func prepareForReuse() {
super.prepareForReuse()
clearTags()
}
// MARK: - Actions
@objc private func profileButtonTapped() {
delegate?.didTapProfileButton()
}
// MARK: - Configuration Methods
// MARK: - Configuration
public func configureCell(data: SectionModel?) {
guard let data = data,
let itemType = data.itemType,
itemType == .profile else {
data.sectionType == .myRewardsProfileInfo else {
configureDefaultState()
return
}
// Check if we have real profile data
if let metadata = data.metadata,
let profile = metadata["profile"] as? ProfileModel {
// Configure with real profile data
configureCell(profile: profile)
} else {
// Configure with default state (no profile data)
configureDefaultState()
}
}
public func configureCell(profile: ProfileModel) {
self.profileModel = profile
// TODO: Configure tag labels with profile data
// We need to determine what data should populate tagView1 and tagView2
// Possible options from ProfileModel:
// - _user_points (loyalty points)
// - _badge (user badge/tier)
// - _verified (verification status)
// - Custom business logic based on profile data
// For now, keep tags visible with current static styling
tagView1.isHidden = false
tagView2.isHidden = false
// Load profile image if available
if !profile._image_url.isEmpty {
loadProfileImage(from: profile._image_url)
} else {
profileImage.image = UIImage(named: "profile_pic_default", in: Bundle.frameworkResourceBundle, compatibleWith: nil)
}
populateTags(segments: profile._user_segments)
}
private func configureDefaultState() {
// Default state: no profile data available
self.profileModel = nil
// Keep tags visible even in default state
tagView1.isHidden = false
tagView2.isHidden = false
profileImage.image = UIImage(named: "profile_pic_default", in: Bundle.frameworkResourceBundle, compatibleWith: nil)
clearTags()
}
// MARK: - Tag Helpers
/// Removes all tag pill views from the stack view.
private func clearTags() {
tagsStackView.arrangedSubviews.forEach { $0.removeFromSuperview() }
}
/// Creates one pill view per segment string and adds them to the stack view.
private func populateTags(segments: [String]) {
clearTags()
for segment in segments where !segment.isEmpty {
let pill = makePillView(text: segment)
tagsStackView.addArrangedSubview(pill)
}
}
private func loadProfileImage(from urlString: String) {
// For now, use default image - can be enhanced later with URL loading
profileImage.image = UIImage(named: "profile_pic_default", in: Bundle.frameworkResourceBundle, compatibleWith: nil)
// TODO: Add dynamic profile picture and tags
/// Builds a rounded pill view with the given text.
private func makePillView(text: String) -> UIView {
let container = UIView()
container.backgroundColor = UIColor(rgb: 0xF1F2F4)
container.layer.cornerRadius = 13
container.clipsToBounds = true
let label = UILabel()
label.text = text
label.font = UIFont(name: "PingLCG-Regular", size: 12)
?? UIFont.systemFont(ofSize: 12)
label.textColor = UIColor(rgb: 0x00111B)
label.numberOfLines = 1
label.translatesAutoresizingMaskIntoConstraints = false
container.addSubview(label)
container.translatesAutoresizingMaskIntoConstraints = false
NSLayoutConstraint.activate([
label.topAnchor.constraint(equalTo: container.topAnchor, constant: 6),
label.bottomAnchor.constraint(equalTo: container.bottomAnchor, constant: -6),
label.leadingAnchor.constraint(equalTo: container.leadingAnchor, constant: 8),
label.trailingAnchor.constraint(equalTo: container.trailingAnchor, constant: -8)
])
return container
}
}
......
<?xml version="1.0" encoding="UTF-8"?>
<document type="com.apple.InterfaceBuilder3.CocoaTouch.XIB" version="3.0" toolsVersion="23094" targetRuntime="iOS.CocoaTouch" propertyAccessControl="none" useAutolayout="YES" useTraitCollections="YES" useSafeAreas="YES" colorMatched="YES">
<document type="com.apple.InterfaceBuilder3.CocoaTouch.XIB" version="3.0" toolsVersion="24506" targetRuntime="iOS.CocoaTouch" propertyAccessControl="none" useAutolayout="YES" useTraitCollections="YES" useSafeAreas="YES" colorMatched="YES">
<device id="retina6_12" orientation="portrait" appearance="light"/>
<dependencies>
<plugIn identifier="com.apple.InterfaceBuilder.IBCocoaTouchPlugin" version="23084"/>
<plugIn identifier="com.apple.InterfaceBuilder.IBCocoaTouchPlugin" version="24504"/>
<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"/>
<tableViewCell contentMode="scaleToFill" selectionStyle="default" indentationWidth="10" reuseIdentifier="MyRewardsProfileInfoTableViewCell" rowHeight="141" id="KGk-i7-Jjw" customClass="MyRewardsProfileInfoTableViewCell">
<rect key="frame" x="0.0" y="0.0" width="318" height="141"/>
<tableViewCell contentMode="scaleToFill" selectionStyle="none" indentationWidth="10" reuseIdentifier="MyRewardsProfileInfoTableViewCell" id="KGk-i7-Jjw" customClass="MyRewardsProfileInfoTableViewCell">
<rect key="frame" x="0.0" y="0.0" width="375" height="100"/>
<autoresizingMask key="autoresizingMask" flexibleMaxX="YES" flexibleMaxY="YES"/>
<tableViewCellContentView key="contentView" opaque="NO" clipsSubviews="YES" multipleTouchEnabled="YES" contentMode="center" tableViewCell="KGk-i7-Jjw" id="H2p-sc-9uM">
<rect key="frame" x="0.0" y="0.0" width="318" height="141"/>
<rect key="frame" x="0.0" y="0.0" width="375" height="100"/>
<autoresizingMask key="autoresizingMask"/>
<subviews>
<view contentMode="scaleToFill" translatesAutoresizingMaskIntoConstraints="NO" id="GrG-Na-dBF" userLabel="Parent View">
<rect key="frame" x="0.0" y="0.0" width="318" height="130.33333333333334"/>
<label opaque="NO" userInteractionEnabled="NO" contentMode="left" horizontalHuggingPriority="251" verticalHuggingPriority="251" text="Rewards" textAlignment="natural" lineBreakMode="middleTruncation" baselineAdjustment="alignBaselines" adjustsFontSizeToFit="NO" translatesAutoresizingMaskIntoConstraints="NO" id="Ttl-lb-001" userLabel="TitleLabel">
<rect key="frame" x="17.999999999999993" y="24" width="109.33333333333331" height="24"/>
<color key="backgroundColor" white="0.0" alpha="0.0" colorSpace="custom" customColorSpace="genericGamma22GrayColorSpace"/>
<fontDescription key="fontDescription" name="HelveticaNeue-Bold" family="Helvetica Neue" pointSize="26"/>
<color key="textColor" red="0.067000000000000004" green="0.067000000000000004" blue="0.067000000000000004" alpha="1" colorSpace="calibratedRGB"/>
<nil key="highlightedColor"/>
</label>
<button opaque="NO" contentMode="scaleToFill" contentHorizontalAlignment="center" contentVerticalAlignment="center" buttonType="system" lineBreakMode="middleTruncation" translatesAutoresizingMaskIntoConstraints="NO" id="PEZ-e6-PaN" userLabel="ProfileButton">
<rect key="frame" x="309" y="12" width="48" height="48"/>
<color key="backgroundColor" white="0.0" alpha="0.0" colorSpace="custom" customColorSpace="genericGamma22GrayColorSpace"/>
<constraints>
<constraint firstAttribute="height" constant="48" id="Btn-h-001"/>
<constraint firstAttribute="width" constant="48" id="Btn-w-001"/>
</constraints>
<state key="normal" title=""/>
</button>
<scrollView clipsSubviews="YES" multipleTouchEnabled="YES" contentMode="scaleToFill" ambiguous="YES" showsHorizontalScrollIndicator="NO" showsVerticalScrollIndicator="NO" translatesAutoresizingMaskIntoConstraints="NO" id="Scr-tv-001" userLabel="TagsScrollView">
<rect key="frame" x="24" y="60" width="279" height="28"/>
<subviews>
<view contentMode="scaleToFill" translatesAutoresizingMaskIntoConstraints="NO" id="Uzq-sj-DeG" userLabel="Top View">
<rect key="frame" x="24" y="35.999999999999993" width="270" height="94.333333333333314"/>
<subviews>
<view contentMode="scaleToFill" translatesAutoresizingMaskIntoConstraints="NO" id="iZR-9I-qrq">
<rect key="frame" x="0.0" y="34.333333333333329" width="58" height="26"/>
<subviews>
<label opaque="NO" userInteractionEnabled="NO" contentMode="left" horizontalHuggingPriority="251" verticalHuggingPriority="251" text="Green" textAlignment="natural" lineBreakMode="tailTruncation" baselineAdjustment="alignBaselines" adjustsFontSizeToFit="NO" translatesAutoresizingMaskIntoConstraints="NO" id="HbR-qg-oZj">
<rect key="frame" x="6" y="3" width="46" height="20"/>
<color key="backgroundColor" white="0.0" alpha="0.0" colorSpace="custom" customColorSpace="genericGamma22GrayColorSpace"/>
<fontDescription key="fontDescription" name="HelveticaNeue" family="Helvetica Neue" pointSize="17"/>
<nil key="textColor"/>
<nil key="highlightedColor"/>
</label>
</subviews>
<color key="backgroundColor" red="0.035294117649999998" green="0.56862745100000001" blue="0.30588235289999999" alpha="1" colorSpace="calibratedRGB"/>
<constraints>
<constraint firstAttribute="trailing" secondItem="HbR-qg-oZj" secondAttribute="trailing" constant="6" id="D5p-jO-24v"/>
<constraint firstItem="HbR-qg-oZj" firstAttribute="leading" secondItem="iZR-9I-qrq" secondAttribute="leading" constant="6" id="LFh-ia-T2B"/>
<constraint firstItem="HbR-qg-oZj" firstAttribute="top" secondItem="iZR-9I-qrq" secondAttribute="top" constant="3" id="RhN-3V-CNu"/>
<constraint firstAttribute="bottom" secondItem="HbR-qg-oZj" secondAttribute="bottom" constant="3" id="aPc-Uy-H9c"/>
</constraints>
</view>
<view contentMode="scaleToFill" translatesAutoresizingMaskIntoConstraints="NO" id="uq8-95-vyl">
<rect key="frame" x="66" y="34.333333333333329" width="61.666666666666657" height="26"/>
<subviews>
<label opaque="NO" userInteractionEnabled="NO" contentMode="left" horizontalHuggingPriority="251" verticalHuggingPriority="251" text="Family" textAlignment="natural" lineBreakMode="tailTruncation" baselineAdjustment="alignBaselines" adjustsFontSizeToFit="NO" translatesAutoresizingMaskIntoConstraints="NO" id="UDU-LU-kJf">
<rect key="frame" x="6" y="3" width="49.666666666666664" height="20"/>
<color key="backgroundColor" white="0.0" alpha="0.0" colorSpace="custom" customColorSpace="genericGamma22GrayColorSpace"/>
<fontDescription key="fontDescription" name="HelveticaNeue" family="Helvetica Neue" pointSize="17"/>
<nil key="textColor"/>
<nil key="highlightedColor"/>
</label>
</subviews>
<color key="backgroundColor" red="0.98823529409999999" green="0.62352941179999999" blue="0.1450980392" alpha="1" colorSpace="calibratedRGB"/>
<constraints>
<constraint firstAttribute="trailing" secondItem="UDU-LU-kJf" secondAttribute="trailing" constant="6" id="Ann-r9-abe"/>
<constraint firstItem="UDU-LU-kJf" firstAttribute="top" secondItem="uq8-95-vyl" secondAttribute="top" constant="3" id="cUu-IO-JNt"/>
<constraint firstAttribute="bottom" secondItem="UDU-LU-kJf" secondAttribute="bottom" constant="3" id="dIU-Z8-BrZ"/>
<constraint firstItem="UDU-LU-kJf" firstAttribute="leading" secondItem="uq8-95-vyl" secondAttribute="leading" constant="6" id="vb0-4P-dZE"/>
</constraints>
</view>
<view contentMode="scaleToFill" translatesAutoresizingMaskIntoConstraints="NO" id="D1N-l1-zYb">
<rect key="frame" x="227" y="0.0" width="43" height="94.333333333333329"/>
<subviews>
<imageView clipsSubviews="YES" userInteractionEnabled="NO" contentMode="scaleAspectFit" horizontalHuggingPriority="251" verticalHuggingPriority="251" translatesAutoresizingMaskIntoConstraints="NO" id="ksj-lM-RAp">
<rect key="frame" x="0.0" y="0.0" width="43" height="43"/>
<color key="backgroundColor" white="0.0" alpha="0.0" colorSpace="custom" customColorSpace="genericGamma22GrayColorSpace"/>
<constraints>
<constraint firstAttribute="width" constant="43" id="MsB-3N-rp3"/>
<constraint firstAttribute="height" constant="43" id="UVr-zI-nCH"/>
</constraints>
</imageView>
<button opaque="NO" contentMode="scaleToFill" contentHorizontalAlignment="center" contentVerticalAlignment="center" buttonType="system" lineBreakMode="middleTruncation" translatesAutoresizingMaskIntoConstraints="NO" id="PEZ-e6-PaN" userLabel="ProfileButton">
<rect key="frame" x="0.0" y="0.0" width="43" height="94.333333333333329"/>
<color key="backgroundColor" white="0.0" alpha="0.0" colorSpace="custom" customColorSpace="genericGamma22GrayColorSpace"/>
<state key="normal" title="Button"/>
<buttonConfiguration key="configuration" style="plain" title="Button">
<color key="baseForegroundColor" white="0.0" alpha="0.0" colorSpace="custom" customColorSpace="genericGamma22GrayColorSpace"/>
</buttonConfiguration>
</button>
</subviews>
<color key="backgroundColor" white="0.0" alpha="0.0" colorSpace="custom" customColorSpace="genericGamma22GrayColorSpace"/>
<constraints>
<constraint firstAttribute="trailing" secondItem="PEZ-e6-PaN" secondAttribute="trailing" id="0Bs-BN-BYr"/>
<constraint firstItem="ksj-lM-RAp" firstAttribute="top" secondItem="D1N-l1-zYb" secondAttribute="top" id="72b-ae-wwu"/>
<constraint firstItem="PEZ-e6-PaN" firstAttribute="leading" secondItem="D1N-l1-zYb" secondAttribute="leading" id="JDf-Bc-agp"/>
<constraint firstAttribute="bottom" secondItem="ksj-lM-RAp" secondAttribute="bottom" id="JVS-lc-V1a"/>
<constraint firstAttribute="bottom" secondItem="PEZ-e6-PaN" secondAttribute="bottom" id="UsX-dl-5BF"/>
<constraint firstAttribute="trailing" secondItem="ksj-lM-RAp" secondAttribute="trailing" id="VMk-Qb-GcZ"/>
<constraint firstItem="ksj-lM-RAp" firstAttribute="leading" secondItem="D1N-l1-zYb" secondAttribute="leading" id="noX-0V-w67"/>
<constraint firstItem="PEZ-e6-PaN" firstAttribute="top" secondItem="D1N-l1-zYb" secondAttribute="top" id="zU6-UR-WGM"/>
</constraints>
</view>
</subviews>
<stackView opaque="NO" contentMode="scaleToFill" ambiguous="YES" spacing="8" translatesAutoresizingMaskIntoConstraints="NO" id="Stk-tv-001" userLabel="TagsStackView">
<rect key="frame" x="0.0" y="0.0" width="0.0" height="28"/>
<color key="backgroundColor" white="0.0" alpha="0.0" colorSpace="custom" customColorSpace="genericGamma22GrayColorSpace"/>
<constraints>
<constraint firstItem="D1N-l1-zYb" firstAttribute="top" secondItem="Uzq-sj-DeG" secondAttribute="top" id="2Pg-pB-HXM"/>
<constraint firstAttribute="trailing" secondItem="D1N-l1-zYb" secondAttribute="trailing" id="TIg-op-IhZ"/>
<constraint firstItem="iZR-9I-qrq" firstAttribute="centerY" secondItem="Uzq-sj-DeG" secondAttribute="centerY" id="Xj6-Va-Vu6"/>
<constraint firstItem="uq8-95-vyl" firstAttribute="leading" secondItem="iZR-9I-qrq" secondAttribute="trailing" constant="8" id="cFB-Jw-8CI"/>
<constraint firstItem="uq8-95-vyl" firstAttribute="centerY" secondItem="Uzq-sj-DeG" secondAttribute="centerY" id="lpD-GB-qJb"/>
<constraint firstItem="iZR-9I-qrq" firstAttribute="leading" secondItem="Uzq-sj-DeG" secondAttribute="leading" id="nqO-fC-fCW"/>
<constraint firstItem="D1N-l1-zYb" firstAttribute="leading" relation="greaterThanOrEqual" secondItem="uq8-95-vyl" secondAttribute="trailing" constant="8" id="yWz-PS-7AW"/>
<constraint firstAttribute="bottom" secondItem="D1N-l1-zYb" secondAttribute="bottom" id="zP0-l8-HZz"/>
</constraints>
</view>
</stackView>
</subviews>
<color key="backgroundColor" white="0.0" alpha="0.0" colorSpace="custom" customColorSpace="genericGamma22GrayColorSpace"/>
<constraints>
<constraint firstAttribute="trailing" secondItem="Uzq-sj-DeG" secondAttribute="trailing" constant="24" id="6Cb-JD-fEd"/>
<constraint firstItem="Uzq-sj-DeG" firstAttribute="top" secondItem="GrG-Na-dBF" secondAttribute="top" constant="36" id="a4m-JH-bDa"/>
<constraint firstItem="Uzq-sj-DeG" firstAttribute="leading" secondItem="GrG-Na-dBF" secondAttribute="leading" constant="24" id="bJt-81-pTc"/>
<constraint firstAttribute="bottom" secondItem="Uzq-sj-DeG" secondAttribute="bottom" id="cjl-n6-BBf"/>
<constraint firstItem="Stk-tv-001" firstAttribute="leading" secondItem="Scr-tv-001" secondAttribute="leading" id="Scr-c-001"/>
<constraint firstItem="Stk-tv-001" firstAttribute="trailing" secondItem="Scr-tv-001" secondAttribute="trailing" id="Scr-c-002"/>
<constraint firstItem="Stk-tv-001" firstAttribute="top" secondItem="Scr-tv-001" secondAttribute="top" id="Scr-c-003"/>
<constraint firstItem="Stk-tv-001" firstAttribute="bottom" secondItem="Scr-tv-001" secondAttribute="bottom" id="Scr-c-004"/>
<constraint firstItem="Stk-tv-001" firstAttribute="height" secondItem="Scr-tv-001" secondAttribute="height" id="Scr-c-005"/>
</constraints>
</view>
</scrollView>
</subviews>
<color key="backgroundColor" white="0.0" alpha="0.0" colorSpace="custom" customColorSpace="genericGamma22GrayColorSpace"/>
<constraints>
<constraint firstItem="GrG-Na-dBF" firstAttribute="leading" secondItem="H2p-sc-9uM" secondAttribute="leading" id="6vh-eL-qMw"/>
<constraint firstAttribute="trailing" secondItem="GrG-Na-dBF" secondAttribute="trailing" id="Mhv-wX-J42"/>
<constraint firstAttribute="bottom" secondItem="GrG-Na-dBF" secondAttribute="bottom" id="WfG-lv-Uw7"/>
<constraint firstItem="GrG-Na-dBF" firstAttribute="top" secondItem="H2p-sc-9uM" secondAttribute="top" id="iSV-2N-pbv"/>
<constraint firstAttribute="trailing" secondItem="PEZ-e6-PaN" secondAttribute="trailing" constant="18" id="Con-btn-001"/>
<constraint firstItem="PEZ-e6-PaN" firstAttribute="centerY" secondItem="Ttl-lb-001" secondAttribute="centerY" id="Con-btn-002"/>
<constraint firstItem="Scr-tv-001" firstAttribute="leading" secondItem="H2p-sc-9uM" secondAttribute="leading" constant="18" id="Con-scr-001"/>
<constraint firstItem="Scr-tv-001" firstAttribute="top" secondItem="Ttl-lb-001" secondAttribute="bottom" constant="12" id="Con-scr-002"/>
<constraint firstItem="Scr-tv-001" firstAttribute="height" constant="28" id="Con-scr-004"/>
<constraint firstAttribute="bottom" secondItem="Scr-tv-001" secondAttribute="bottom" constant="12" id="Con-scr-005"/>
<constraint firstItem="Ttl-lb-001" firstAttribute="leading" secondItem="H2p-sc-9uM" secondAttribute="leading" constant="18" id="Con-tl-001"/>
<constraint firstItem="Ttl-lb-001" firstAttribute="top" secondItem="H2p-sc-9uM" secondAttribute="top" constant="24" id="Con-tl-002"/>
<constraint firstItem="PEZ-e6-PaN" firstAttribute="leading" relation="greaterThanOrEqual" secondItem="Ttl-lb-001" secondAttribute="trailing" constant="8" id="Con-tl-003"/>
<constraint firstAttribute="trailing" secondItem="Scr-tv-001" secondAttribute="trailing" constant="18" id="SXS-cd-zKP"/>
</constraints>
</tableViewCellContentView>
<viewLayoutGuide key="safeArea" id="njF-e1-oar"/>
<color key="backgroundColor" white="0.0" alpha="0.0" colorSpace="custom" customColorSpace="genericGamma22GrayColorSpace"/>
<connections>
<outlet property="profileButton" destination="PEZ-e6-PaN" id="FBL-8U-9OZ"/>
<outlet property="profileImage" destination="ksj-lM-RAp" id="lwv-9G-Mmy"/>
<outlet property="tagLabel1" destination="HbR-qg-oZj" id="Ggl-NO-w2a"/>
<outlet property="tagLabel2" destination="UDU-LU-kJf" id="Tc6-yb-xi1"/>
<outlet property="tagView1" destination="iZR-9I-qrq" id="EtM-Q0-Ru9"/>
<outlet property="tagView2" destination="uq8-95-vyl" id="mP6-vQ-GY6"/>
<outlet property="tagsScrollView" destination="Scr-tv-001" id="Out-scr-001"/>
<outlet property="tagsStackView" destination="Stk-tv-001" id="Out-stk-001"/>
<outlet property="titleLabel" destination="Ttl-lb-001" id="Out-tl-001"/>
</connections>
<point key="canvasLocation" x="41.221374045801525" y="29.929577464788736"/>
</tableViewCell>
......