hank
2018-08-30 7be7ad711909f384c4a9bc0a7f2991a50ae69049
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
/*
 * Copyright (C) 2017 Twitter, Inc.
 *
 * Licensed under the Apache License, Version 2.0 (the "License");
 * you may not use this file except in compliance with the License.
 * You may obtain a copy of the License at
 *
 *      http://www.apache.org/licenses/LICENSE-2.0
 *
 * Unless required by applicable law or agreed to in writing, software
 * distributed under the License is distributed on an "AS IS" BASIS,
 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
 * See the License for the specific language governing permissions and
 * limitations under the License.
 *
 */
 
#import <UIKit/UIKit.h>
#import "TWTRTweetViewDelegate.h"
 
@class TWTRTweet;
 
NS_ASSUME_NONNULL_BEGIN
 
/**
 *  The style for Tweet views.
 */
typedef NS_ENUM(NSUInteger, TWTRTweetViewStyle) {
 
    /**
     *  A full-size Tweet view. Displays images if present.
     */
    TWTRTweetViewStyleRegular,
 
    /**
     *  A small Tweet view, primarily designed to be used in table views.
     */
    TWTRTweetViewStyleCompact
};
 
/**
 *  A default combination of colors for Tweet views.
 */
typedef NS_ENUM(NSUInteger, TWTRTweetViewTheme) {
 
    /**
     *  Official light theme.
     */
    TWTRTweetViewThemeLight,
 
    /**
     *  Official dark theme.
     */
    TWTRTweetViewThemeDark,
};
 
/**
 `TWTRTweetView` displays a single Tweet to the user. It handles background taps and other actions displayed to the user.
 
    TWTRAPIClient *APIClient = [[TWTRAPIClient alloc] init];
    [[APIClient loadTweetWithID:@"20" completion:^(TWTRTweet *tweet, NSError *error) {
        if (tweet) {
            TWTRTweetView *tweetView = [[TWTRTweetView alloc] initWithTweet:tweet];
            [self.view addSubview:tweetView];
        } else {
            NSLog(@"Error loading Tweet: %@", [error localizedDescription]);
        }
    }];
 
 ## Interaction
 
 The `TWTRTweetViewDelegate` is notified:
 
   - When the background is tapped.
   - When a link is selected.
   - When the share button is tapped.
   - When the share action completes.
   - When the favorite action completes.
   - When the video (if available) is paused or started to play.
 
 ## Usage in UITableView
 
 To allow for usage in a `UITableView`, the `configureWithTweet:` method allows configuration of an existing `TWTRTweetView` without having to create a new instance.
 
 ## Sizing
 
 When using Auto Layout, feel free to set a width or margin on the Tweet view. The height will be calculated automatically. For old-fashioned frame based layout you may use the standard `sizeThatFits:` method to calculate the appropriate height for a given width:
 
    // Find the height for a given width (20pts on either side)
    CGFloat desiredHeight = [tweetView sizeThatFits:CGSizeMake(self.view.frame.size.width - 40, CGFLOAT_MAX)].height;
 
 ## UIAppearance
 
 You may use UIAppearance proxy objects to style certain aspects of Tweet views before those views are added to the view hierarchy.
 
     // Using UIAppearance Proxy
     [TWTRTweetView appearance].theme = TWTRTweetViewThemeDark;
 
     // Setting colors directly
     [TWTRTweetView appearance].primaryTextColor = [UIColor yellowColor];
     [TWTRTweetView appearance].backgroundColor = [UIColor blueColor];
 
     // Setting action button visibility
     [TWTRTweetView appearance].showActionButtons = NO;
 
 _Note:_ You can't change the theme through an appearance proxy after the view has already been added to the view hierarchy. Direct `theme` property access will work though.
 */
@interface TWTRTweetView : UIView <UIAppearanceContainer>
 
/**
 *  The Tweet being displayed.
 */
@property (nonatomic, readonly) TWTRTweet *tweet;
 
/**
 *  Background color of the Tweet view and all text labels (fullname, username, Tweet text, timestamp).
 */
@property (nonatomic) UIColor *backgroundColor UI_APPEARANCE_SELECTOR;
 
/**
 *  Color of Tweet text and full name.
 */
@property (nonatomic) UIColor *primaryTextColor UI_APPEARANCE_SELECTOR;
 
/**
 *  Color of links in Tweet text.
 */
@property (nonatomic) UIColor *linkTextColor UI_APPEARANCE_SELECTOR;
 
/**
 *  Set whether the border should be shown.
 *  Defaults to YES.
 */
@property (nonatomic) BOOL showBorder UI_APPEARANCE_SELECTOR;
 
/**
 * Set whether or not videos playing inline should be muted.
 * Defaults to NO.
 */
@property (nonatomic) BOOL shouldPlayVideoMuted;
 
/**
 *  Set whether the action buttons (Favorite, Share) should be shown. When toggled,
 *  both the visibility of the action buttons and the internal constraints are
 *  updated immediately. The layout will be updated the next layout pass that occurs.
 *
 *  Defaults to NO.
 */
@property (nonatomic) BOOL showActionButtons;
 
/**
 *  Setting the theme of the Tweet view will change the color properties accordingly.
 *
 *  Set to `TWTRTweetViewThemeLight` by default.
 */
@property (nonatomic) TWTRTweetViewTheme theme;
 
/**
 *  The style of the Tweet. i.e. `TWTRTweetViewStyleRegular` or `TWTRTweetViewStyleCompact`.
 */
@property (nonatomic, readonly) TWTRTweetViewStyle style;
 
/**
 *  Optional delegate to receive notifications when certain actions happen
 */
@property (nonatomic, weak) IBOutlet id<TWTRTweetViewDelegate> delegate;
 
/**
 *  Optional property to set a UIViewController from which to present various new UI
 *  e.g. when presenting a Share sheet, presenting a login view controller for actions, etc
 */
@property (nonatomic, weak) UIViewController *presenterViewController;
 
/**
 *  Convenience initializer to configure a compact style Tweet view.
 *
 *  @param tweet The Tweet to display.
 *
 *  @return The fully-configured Tweet view.
 */
- (instancetype)initWithTweet:(nullable TWTRTweet *)tweet;
 
/**
 *  Designated initializer. Initializes view with both Tweet and style.
 *
 *  @param tweet The Tweet to display.
 *  @param style The style of the Tweet view (regular or compact).
 *
 *  @return The fully configured Tweet view.
 */
- (instancetype)initWithTweet:(nullable TWTRTweet *)tweet style:(TWTRTweetViewStyle)style;
 
/**
 * Initialization with a frame parameter is not supported.
 */
- (instancetype)initWithFrame:(CGRect)frame NS_UNAVAILABLE;
 
/**
  Find the size that fits into a desired space. This is a system method on UIView but implemented on `TWTRTweetView`
 
    // Calculate the desired height at 280 points wide
    CGSize desiredSize = [tweetView sizeThatFits:CGSizeMake(280, CGFLOAT_MAX)];
 
 
   @param size The space available. Should generally leave one orientation unconstrained, and the minimum width supported is 200pts.
 
   @return The size that will fit into the space available.
 */
- (CGSize)sizeThatFits:(CGSize)size;
 
/**
 *  Update all images and label text to fully represent the given Tweet.
 *
 *  @param tweet The Tweet to display.
 */
- (void)configureWithTweet:(nullable TWTRTweet *)tweet;
 
/**
 * If the tweet contains playable media, calling this function will play the media. The media will also play if
 * the user taps on the play button for the media.
 */
- (void)playVideo;
 
/**
 * If the tweet contains media that is currently playing, this function will pause the current video.
 *
 * If a TWTRTweetVideo is being added to a UICollectionView, implement the delegate collectionView:didEndDisplayingCell:forItemAtIndexPath: 
 * and call pauseVideo here so videos stop playing when the user scrolls off the screen.
 */
- (void)pauseVideo;
 
@end
 
NS_ASSUME_NONNULL_END