/* * 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 #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 /** * 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 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