5
5
// Created by Christopher G Prince on 4/22/19.
6
6
//
7
7
8
+ // By default: This resizes its height to what it needs to have to present its `LinkData`. It keeps the width you set.
9
+ // If you don't want this behavior, use the `LinkPreviewSizing` parameter below.
10
+
8
11
import UIKit
9
12
10
13
public class LinkPreview : UIView {
11
14
@IBOutlet weak var topLevelView : UIView !
12
15
@IBOutlet weak var contentView : UIView !
16
+
13
17
@IBOutlet weak var imageHeight : NSLayoutConstraint !
14
18
@IBOutlet public weak var image : UIImageView !
19
+
15
20
@IBOutlet weak var title : UILabel !
16
21
@IBOutlet weak var url : UILabel !
17
22
@IBOutlet weak var icon : UIImageView !
18
23
@IBOutlet weak var iconContainerWidth : NSLayoutConstraint !
24
+
19
25
@IBOutlet weak var textAndIconContainer : UIView !
26
+
20
27
public var textAndIconAction : ( ( ) -> ( ) ) ?
21
28
private var haveImage : Bool = false
22
29
private var doneSetup = false
30
+ var sizing : LinkPreviewSizing ?
23
31
24
32
public enum LoadedImage {
25
33
case large( UIImage )
@@ -80,9 +88,9 @@ public class LinkPreview: UIView {
80
88
}
81
89
}
82
90
83
- public static func create( with linkData: LinkData , callback: ( ( _ image: LoadedImage ? ) -> ( ) ) ? = nil ) -> LinkPreview {
91
+ public static func create( with linkData: LinkData , sizing : LinkPreviewSizing ? = nil , callback: ( ( _ image: LoadedImage ? ) -> ( ) ) ? = nil ) -> LinkPreview {
84
92
let preview = LinkPreview ( )
85
- preview. setup ( with: linkData, callback: callback)
93
+ preview. setup ( with: linkData, sizing : sizing , callback: callback)
86
94
return preview
87
95
}
88
96
@@ -93,8 +101,9 @@ public class LinkPreview: UIView {
93
101
94
102
/// The image is passed back in the form of a callback to allow for asynchronous image loading if needed.
95
103
// Image data are loaded from the linkData icon/image URL's, if non-nil. Those URL's can refer to either local or remote files.
96
- public func setup( with linkData: LinkData , callback: ( ( _ image: LoadedImage ? ) -> ( ) ) ? = nil ) {
97
- title. numberOfLines = Int ( PreviewManager . session. config. maxNumberTitleLines)
104
+ public func setup( with linkData: LinkData , sizing: LinkPreviewSizing ? = nil , callback: ( ( _ image: LoadedImage ? ) -> ( ) ) ? = nil ) {
105
+ self . sizing = sizing
106
+
98
107
title. text = linkData. title
99
108
url. text = linkData. url. urlWithoutScheme ( )
100
109
@@ -105,6 +114,14 @@ public class LinkPreview: UIView {
105
114
106
115
var result : LoadedImage ?
107
116
117
+ let heightIsResizable = sizing? . resizingAllowed ?? false
118
+
119
+ title. numberOfLines = Int ( PreviewManager . session. config. maxNumberTitleLines)
120
+
121
+ if let sizingNumberTitleLines = sizing? . titleLabelNumberOfLines {
122
+ title. numberOfLines = sizingNumberTitleLines
123
+ }
124
+
108
125
if let imageURL = linkData. image,
109
126
let data = try ? Data ( contentsOf: imageURL. attemptForceScheme ( forceScheme) ) {
110
127
haveImage = true
@@ -113,9 +130,19 @@ public class LinkPreview: UIView {
113
130
result = . large( image)
114
131
}
115
132
applyCornerRounding ( view: contentView)
133
+
134
+ // Not showing the icon-- because we have the large image
116
135
iconContainerWidth. constant = 0
136
+
117
137
layoutIfNeeded ( )
118
- frame. size. height = textAndIconContainer. frame. height + image. frame. height
138
+
139
+ if heightIsResizable {
140
+ frame. size. height = textAndIconContainer. frame. height + image. frame. height
141
+ }
142
+ else {
143
+ // We can't change the height of the `LinkPreview`. Change the imageHeight to the most it can have.
144
+ imageHeight. constant = max ( frame. size. height - textAndIconContainer. frame. height, 0 )
145
+ }
119
146
}
120
147
else {
121
148
haveImage = false
@@ -132,10 +159,13 @@ public class LinkPreview: UIView {
132
159
}
133
160
}
134
161
else {
162
+ // No image, no icon. Hide the icon.
135
163
iconContainerWidth. constant = 0
136
164
}
137
165
166
+ // No image.
138
167
imageHeight. constant = 0
168
+
139
169
layoutIfNeeded ( )
140
170
frame. size. height = textAndIconContainer. frame. height
141
171
}
0 commit comments