mirror of
https://gitlab.opencode.de/bwi/bundesmessenger/clients/bundesmessenger-ios.git
synced 2026-05-09 17:37:43 +02:00
Merge pull request #1383 from vector-im/riot_meta_75
UX Rework: Add edition mode in home page
This commit is contained in:
@@ -24,9 +24,17 @@
|
||||
#import "TableViewCellWithCollectionView.h"
|
||||
#import "RoomCollectionViewCell.h"
|
||||
|
||||
#import "MXRoom+Riot.h"
|
||||
|
||||
@interface HomeViewController ()
|
||||
{
|
||||
RecentsDataSource *recentsDataSource;
|
||||
|
||||
// Room edition
|
||||
NSInteger editedSection;
|
||||
NSString *selectedRoomId;
|
||||
UISwipeGestureRecognizer *horizontalSwipeGestureRecognizer;
|
||||
UISwipeGestureRecognizer *verticalSwipeGestureRecognizer;
|
||||
}
|
||||
@end
|
||||
|
||||
@@ -36,6 +44,9 @@
|
||||
{
|
||||
[super finalizeInit];
|
||||
|
||||
editedSection = -1;
|
||||
selectedRoomId = nil;
|
||||
|
||||
self.screenName = @"Home";
|
||||
}
|
||||
|
||||
@@ -156,6 +167,48 @@
|
||||
}
|
||||
}
|
||||
|
||||
- (void)scrollToTop:(BOOL)animated
|
||||
{
|
||||
if (selectedRoomId)
|
||||
{
|
||||
[self cancelEditionMode:YES];
|
||||
}
|
||||
|
||||
[super scrollToTop:animated];
|
||||
}
|
||||
|
||||
- (void)onPlusButtonPressed
|
||||
{
|
||||
if (selectedRoomId)
|
||||
{
|
||||
[self cancelEditionMode:YES];
|
||||
}
|
||||
|
||||
[super onPlusButtonPressed];
|
||||
}
|
||||
|
||||
- (void)cancelEditionMode:(BOOL)forceRefresh
|
||||
{
|
||||
if (selectedRoomId)
|
||||
{
|
||||
// Ignore forceRefresh, a table refresh is forced at the end.
|
||||
[super cancelEditionMode:NO];
|
||||
|
||||
editedRoomId = selectedRoomId = nil;
|
||||
editedSection = -1;
|
||||
|
||||
// Remove existing gesture recognizers
|
||||
[self.recentsTableView removeGestureRecognizer:horizontalSwipeGestureRecognizer];
|
||||
horizontalSwipeGestureRecognizer = nil;
|
||||
[self.recentsTableView removeGestureRecognizer:verticalSwipeGestureRecognizer];
|
||||
verticalSwipeGestureRecognizer = nil;
|
||||
|
||||
self.recentsTableView.scrollEnabled = YES;
|
||||
|
||||
[self refreshRecentsTable];
|
||||
}
|
||||
}
|
||||
|
||||
#pragma mark - UITableViewDataSource
|
||||
|
||||
- (NSInteger)numberOfSectionsInTableView:(UITableView *)tableView
|
||||
@@ -166,6 +219,9 @@
|
||||
|
||||
- (NSInteger)tableView:(UITableView *)tableView numberOfRowsInSection:(NSInteger)section
|
||||
{
|
||||
// Edit the potential selected room (see `onCollectionViewCellLongPress`).
|
||||
editedRoomId = selectedRoomId;
|
||||
|
||||
// Each rooms section is represented by only one collection view.
|
||||
return 1;
|
||||
}
|
||||
@@ -185,6 +241,52 @@
|
||||
tableViewCell.collectionView.dataSource = self;
|
||||
tableViewCell.selectionStyle = UITableViewCellSelectionStyleNone;
|
||||
|
||||
if (editedSection != -1 && editedRoomId)
|
||||
{
|
||||
// Disable collection scrolling during edition
|
||||
tableViewCell.collectionView.scrollEnabled = NO;
|
||||
|
||||
if (indexPath.section == editedSection)
|
||||
{
|
||||
// Show edition menu
|
||||
tableViewCell.editionViewHeightConstraint.constant = 65;
|
||||
tableViewCell.editionView.hidden = NO;
|
||||
|
||||
MXRoom *room = [self.mainSession roomWithRoomId:editedRoomId];
|
||||
|
||||
// Update the edition menu content (Use the button tag to store the current value).
|
||||
tableViewCell.directChatButton.tag = room.isDirect;
|
||||
[tableViewCell.directChatButton addTarget:self action:@selector(onDirectChatButtonPressed:) forControlEvents:UIControlEventTouchUpInside];
|
||||
tableViewCell.directChatImageView.image = tableViewCell.directChatButton.tag ? [UIImage imageNamed:@"directChatOff"] : [UIImage imageNamed:@"directChatOn"];
|
||||
|
||||
tableViewCell.notificationsButton.tag = room.isMute || room.isMentionsOnly;
|
||||
[tableViewCell.notificationsButton addTarget:self action:@selector(onNotificationsButtonPressed:) forControlEvents:UIControlEventTouchUpInside];
|
||||
tableViewCell.notificationsImageView.image = tableViewCell.notificationsButton.tag ? [UIImage imageNamed:@"notifications"] : [UIImage imageNamed:@"notificationsOff"];
|
||||
|
||||
// Get the room tag (use only the first one).
|
||||
MXRoomTag* currentTag = nil;
|
||||
if (room.accountData.tags)
|
||||
{
|
||||
NSArray<MXRoomTag*>* tags = room.accountData.tags.allValues;
|
||||
if (tags.count)
|
||||
{
|
||||
currentTag = [tags objectAtIndex:0];
|
||||
}
|
||||
}
|
||||
|
||||
tableViewCell.favouriteButton.tag = (currentTag && [kMXRoomTagFavourite isEqualToString:currentTag.name]);
|
||||
[tableViewCell.favouriteButton addTarget:self action:@selector(onFavouriteButtonPressed:) forControlEvents:UIControlEventTouchUpInside];
|
||||
tableViewCell.favouriteImageView.image = tableViewCell.favouriteButton.tag ? [UIImage imageNamed:@"favouriteOff"] : [UIImage imageNamed:@"favourite"];
|
||||
|
||||
tableViewCell.priorityButton.tag = (currentTag && [kMXRoomTagLowPriority isEqualToString:currentTag.name]);
|
||||
[tableViewCell.priorityButton addTarget:self action:@selector(onPriorityButtonPressed:) forControlEvents:UIControlEventTouchUpInside];
|
||||
tableViewCell.priorityImageView.image = tableViewCell.priorityButton.tag ? [UIImage imageNamed:@"priorityHigh"] : [UIImage imageNamed:@"priorityLow"];
|
||||
|
||||
[tableViewCell.leaveButton addTarget:self action:@selector(onLeaveButtonPressed:) forControlEvents:UIControlEventTouchUpInside];
|
||||
tableViewCell.leaveImageView.image = [UIImage imageNamed:@"leave"];
|
||||
}
|
||||
}
|
||||
|
||||
return tableViewCell;
|
||||
}
|
||||
|
||||
@@ -203,8 +305,16 @@
|
||||
return [recentsDataSource cellHeightAtIndexPath:indexPath];
|
||||
}
|
||||
|
||||
// Return the fixed height of the collection view cell used to display a room.
|
||||
return [RoomCollectionViewCell defaultCellSize].height;
|
||||
if (indexPath.section != editedSection)
|
||||
{
|
||||
// Return the fixed height of the collection view cell used to display a room.
|
||||
return [RoomCollectionViewCell defaultCellSize].height;
|
||||
}
|
||||
else
|
||||
{
|
||||
// Add the edition view height
|
||||
return [RoomCollectionViewCell defaultCellSize].height + 65.0;
|
||||
}
|
||||
}
|
||||
|
||||
#pragma mark - UICollectionViewDataSource
|
||||
@@ -225,10 +335,25 @@
|
||||
{
|
||||
[cell render:cellData];
|
||||
cell.tag = indexPath.item;
|
||||
cell.collectionViewTag = collectionView.tag;
|
||||
|
||||
//TODO: add long tap gesture recognizer.
|
||||
// UILongPressGestureRecognizer *cellLongPressGesture = [[UILongPressGestureRecognizer alloc] initWithTarget:self action:@selector(onCollectionViewCellLongPress:)];
|
||||
// [cell addGestureRecognizer:cellLongPressGesture];
|
||||
// Edition mode?
|
||||
if (editedRoomId)
|
||||
{
|
||||
UITapGestureRecognizer *tapGesture = [[UITapGestureRecognizer alloc] initWithTarget:self action:@selector(onCollectionViewCellTap:)];
|
||||
[cell addGestureRecognizer:tapGesture];
|
||||
|
||||
if ([cellData.roomSummary.roomId isEqualToString:editedRoomId])
|
||||
{
|
||||
cell.editionArrowView.hidden = NO;
|
||||
}
|
||||
}
|
||||
else
|
||||
{
|
||||
// Add long tap gesture recognizer.
|
||||
UILongPressGestureRecognizer *cellLongPressGesture = [[UILongPressGestureRecognizer alloc] initWithTarget:self action:@selector(onCollectionViewCellLongPress:)];
|
||||
[cell addGestureRecognizer:cellLongPressGesture];
|
||||
}
|
||||
}
|
||||
|
||||
return cell;
|
||||
@@ -260,4 +385,138 @@
|
||||
return [RoomCollectionViewCell defaultCellSize];
|
||||
}
|
||||
|
||||
#pragma mark - Gesture Recognizer
|
||||
|
||||
- (void)onCollectionViewCellLongPress:(UIGestureRecognizer*)gestureRecognizer
|
||||
{
|
||||
RoomCollectionViewCell *selectedCell;
|
||||
|
||||
if (gestureRecognizer.state == UIGestureRecognizerStateBegan)
|
||||
{
|
||||
UIView *view = gestureRecognizer.view;
|
||||
if ([view isKindOfClass:[RoomCollectionViewCell class]])
|
||||
{
|
||||
selectedCell = (RoomCollectionViewCell*)view;
|
||||
|
||||
MXRoom* room = [self.dataSource getRoomAtIndexPath:[NSIndexPath indexPathForRow:selectedCell.tag inSection:selectedCell.collectionViewTag]];
|
||||
|
||||
if (room)
|
||||
{
|
||||
// Display no action for the invited room
|
||||
if (room.state.membership == MXMembershipInvite)
|
||||
{
|
||||
return;
|
||||
}
|
||||
|
||||
// Store the identifier of the room related to the edited cell.
|
||||
selectedRoomId = room.state.roomId;
|
||||
// Store the concerned section
|
||||
editedSection = selectedCell.collectionViewTag;
|
||||
|
||||
[self refreshRecentsTable];
|
||||
|
||||
// Make visible the edited cell
|
||||
TableViewCellWithCollectionView *tableViewCellWithCollectionView = [self.recentsTableView cellForRowAtIndexPath:[NSIndexPath indexPathForRow:0 inSection:editedSection]];
|
||||
NSIndexPath *indexPath = [self.dataSource cellIndexPathWithRoomId:selectedRoomId andMatrixSession:room.mxSession];
|
||||
indexPath = [NSIndexPath indexPathForItem:indexPath.item inSection:0];
|
||||
UICollectionViewCell *roomCollectionViewCell = [tableViewCellWithCollectionView.collectionView cellForItemAtIndexPath:indexPath];
|
||||
[tableViewCellWithCollectionView.collectionView scrollRectToVisible:roomCollectionViewCell.frame animated:YES];
|
||||
[self.recentsTableView scrollRectToVisible:tableViewCellWithCollectionView.frame animated:YES];
|
||||
|
||||
// Disable table view scrolling, and defined the swipe gesture recognizers used to cancel the edition mode
|
||||
self.recentsTableView.scrollEnabled = NO;
|
||||
horizontalSwipeGestureRecognizer = [[UISwipeGestureRecognizer alloc] initWithTarget:self action:@selector(onTableViewSwipe:)];
|
||||
[horizontalSwipeGestureRecognizer setDirection:(UISwipeGestureRecognizerDirectionLeft | UISwipeGestureRecognizerDirectionRight)];
|
||||
[self.recentsTableView addGestureRecognizer:horizontalSwipeGestureRecognizer];
|
||||
verticalSwipeGestureRecognizer = [[UISwipeGestureRecognizer alloc] initWithTarget:self action:@selector(onTableViewSwipe:)];
|
||||
[verticalSwipeGestureRecognizer setDirection:(UISwipeGestureRecognizerDirectionUp | UISwipeGestureRecognizerDirectionDown)];
|
||||
[self.recentsTableView addGestureRecognizer:verticalSwipeGestureRecognizer];
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
- (void)onCollectionViewCellTap:(UIGestureRecognizer*)gestureRecognizer
|
||||
{
|
||||
[self cancelEditionMode:YES];
|
||||
}
|
||||
|
||||
- (void)onTableViewSwipe:(UIGestureRecognizer*)gestureRecognizer
|
||||
{
|
||||
[self cancelEditionMode:YES];
|
||||
}
|
||||
|
||||
#pragma mark - Action
|
||||
|
||||
- (IBAction)onDirectChatButtonPressed:(id)sender
|
||||
{
|
||||
if (editedRoomId)
|
||||
{
|
||||
MXRoom *room = [self.mainSession roomWithRoomId:editedRoomId];
|
||||
if (room)
|
||||
{
|
||||
UIButton *button = (UIButton*)sender;
|
||||
[self makeDirectEditedRoom:!button.tag];
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
- (IBAction)onNotificationsButtonPressed:(id)sender
|
||||
{
|
||||
if (editedRoomId)
|
||||
{
|
||||
MXRoom *room = [self.mainSession roomWithRoomId:editedRoomId];
|
||||
if (room)
|
||||
{
|
||||
UIButton *button = (UIButton*)sender;
|
||||
[self muteEditedRoomNotifications:!button.tag];
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
- (IBAction)onFavouriteButtonPressed:(id)sender
|
||||
{
|
||||
if (editedRoomId)
|
||||
{
|
||||
MXRoom *room = [self.mainSession roomWithRoomId:editedRoomId];
|
||||
if (room)
|
||||
{
|
||||
UIButton *button = (UIButton*)sender;
|
||||
if (button.tag)
|
||||
{
|
||||
[self updateEditedRoomTag:nil];
|
||||
}
|
||||
else
|
||||
{
|
||||
[self updateEditedRoomTag:kMXRoomTagFavourite];
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
- (IBAction)onPriorityButtonPressed:(id)sender
|
||||
{
|
||||
if (editedRoomId)
|
||||
{
|
||||
MXRoom *room = [self.mainSession roomWithRoomId:editedRoomId];
|
||||
if (room)
|
||||
{
|
||||
UIButton *button = (UIButton*)sender;
|
||||
if (button.tag)
|
||||
{
|
||||
[self updateEditedRoomTag:nil];
|
||||
}
|
||||
else
|
||||
{
|
||||
[self updateEditedRoomTag:kMXRoomTagLowPriority];
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
- (IBAction)onLeaveButtonPressed:(id)sender
|
||||
{
|
||||
[self leaveEditedRoom];
|
||||
}
|
||||
|
||||
@end
|
||||
|
||||
@@ -20,6 +20,11 @@
|
||||
@interface RecentsViewController : MXKRecentListViewController <MXKRecentListViewControllerDelegate>
|
||||
{
|
||||
@protected
|
||||
/**
|
||||
The room identifier related to the cell which is in editing mode (if any).
|
||||
*/
|
||||
NSString *editedRoomId;
|
||||
|
||||
/**
|
||||
The image view of the (+) button.
|
||||
*/
|
||||
@@ -106,6 +111,12 @@
|
||||
*/
|
||||
- (void)refreshCurrentSelectedCell:(BOOL)forceVisible;
|
||||
|
||||
/**
|
||||
Leave the edition mode
|
||||
|
||||
@param forceRefresh force table view refresh
|
||||
*/
|
||||
- (void)cancelEditionMode:(BOOL)forceRefresh;
|
||||
|
||||
#pragma mark - Room handling
|
||||
/**
|
||||
@@ -129,6 +140,33 @@
|
||||
*/
|
||||
- (void)joinARoom;
|
||||
|
||||
/**
|
||||
Leave the selected room.
|
||||
*/
|
||||
- (void)leaveEditedRoom;
|
||||
|
||||
/**
|
||||
Update the selected room tag.
|
||||
*/
|
||||
- (void)updateEditedRoomTag:(NSString*)tag;
|
||||
|
||||
/**
|
||||
Enable/disable the direct flag of the selected room.
|
||||
*/
|
||||
- (void)makeDirectEditedRoom:(BOOL)isDirect;
|
||||
|
||||
/**
|
||||
Enable/disable the notifications for the selected room.
|
||||
*/
|
||||
- (void)muteEditedRoomNotifications:(BOOL)mute;
|
||||
|
||||
#pragma mark - Scrolling
|
||||
|
||||
/**
|
||||
Scroll to the top of the recents list.
|
||||
*/
|
||||
- (void)scrollToTop:(BOOL)animated;
|
||||
|
||||
/**
|
||||
Scroll the next room with missed notifications to the top.
|
||||
|
||||
|
||||
@@ -35,9 +35,6 @@
|
||||
|
||||
@interface RecentsViewController ()
|
||||
{
|
||||
// The room identifier related to the cell which is in editing mode (if any).
|
||||
NSString *editedRoomId;
|
||||
|
||||
// Tell whether a recents refresh is pending (suspended during editing mode).
|
||||
BOOL isRefreshPending;
|
||||
|
||||
@@ -140,7 +137,7 @@
|
||||
UIApplicationDidEnterBackgroundNotificationObserver = [[NSNotificationCenter defaultCenter] addObserverForName:UIApplicationDidEnterBackgroundNotification object:nil queue:[NSOperationQueue mainQueue] usingBlock:^(NSNotification *notif) {
|
||||
|
||||
// Leave potential editing mode
|
||||
[self setEditing:NO];
|
||||
[self cancelEditionMode:isRefreshPending];
|
||||
|
||||
}];
|
||||
|
||||
@@ -225,7 +222,7 @@
|
||||
[super viewWillDisappear:animated];
|
||||
|
||||
// Leave potential editing mode
|
||||
[self setEditing:NO];
|
||||
[self cancelEditionMode:NO];
|
||||
|
||||
if (kAppDelegateDidTapStatusBarNotificationObserver)
|
||||
{
|
||||
@@ -287,6 +284,8 @@
|
||||
return;
|
||||
}
|
||||
|
||||
isRefreshPending = NO;
|
||||
|
||||
if (editedRoomId)
|
||||
{
|
||||
// Check whether the user didn't leave the room
|
||||
@@ -298,13 +297,12 @@
|
||||
}
|
||||
else
|
||||
{
|
||||
// Cancel the editing mode
|
||||
editedRoomId = nil;
|
||||
// Cancel the editing mode, a new refresh will be triggered.
|
||||
[self cancelEditionMode:YES];
|
||||
return;
|
||||
}
|
||||
}
|
||||
|
||||
isRefreshPending = NO;
|
||||
|
||||
// Force reset existing sticky headers if any
|
||||
[self resetStickyHeaders];
|
||||
|
||||
@@ -382,6 +380,26 @@
|
||||
}
|
||||
}
|
||||
|
||||
- (void)cancelEditionMode:(BOOL)forceRefresh
|
||||
{
|
||||
if (self.recentsTableView.isEditing || self.isEditing)
|
||||
{
|
||||
// Leave editing mode first
|
||||
isRefreshPending = forceRefresh;
|
||||
[self setEditing:NO];
|
||||
}
|
||||
else
|
||||
{
|
||||
// Clean
|
||||
editedRoomId = nil;
|
||||
|
||||
if (forceRefresh)
|
||||
{
|
||||
[self refreshRecentsTable];
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
#pragma mark - Sticky Headers
|
||||
|
||||
- (void)setEnableStickyHeaders:(BOOL)enableStickyHeaders
|
||||
@@ -683,11 +701,6 @@
|
||||
|
||||
#pragma mark - Internal methods
|
||||
|
||||
- (void)scrollToTop:(BOOL)animated
|
||||
{
|
||||
[self.recentsTableView setContentOffset:CGPointMake(-self.recentsTableView.contentInset.left, -self.recentsTableView.contentInset.top) animated:animated];
|
||||
}
|
||||
|
||||
-(void)showPublicRoomsDirectory
|
||||
{
|
||||
// Here the recents view controller is displayed inside a unified search view controller.
|
||||
@@ -743,7 +756,7 @@
|
||||
// Retrieve the invited room
|
||||
MXRoom *invitedRoom = userInfo[kInviteRecentTableViewCellRoomKey];
|
||||
|
||||
[self setEditing:NO];
|
||||
[self cancelEditionMode:isRefreshPending];
|
||||
|
||||
// Decline the invitation
|
||||
[invitedRoom leave:^{
|
||||
@@ -893,12 +906,7 @@
|
||||
|
||||
- (void)tableView:(UITableView*)tableView didEndEditingRowAtIndexPath:(NSIndexPath *)indexPath
|
||||
{
|
||||
editedRoomId = nil;
|
||||
|
||||
if (isRefreshPending)
|
||||
{
|
||||
[self refreshRecentsTable];
|
||||
}
|
||||
[self cancelEditionMode:isRefreshPending];
|
||||
}
|
||||
|
||||
- (void)leaveEditedRoom
|
||||
@@ -924,8 +932,7 @@
|
||||
[self stopActivityIndicator];
|
||||
|
||||
// Force table refresh
|
||||
editedRoomId = nil;
|
||||
[self refreshRecentsTable];
|
||||
[self cancelEditionMode:YES];
|
||||
|
||||
} failure:^(NSError *error) {
|
||||
|
||||
@@ -937,13 +944,13 @@
|
||||
[self stopActivityIndicator];
|
||||
|
||||
// Leave editing mode
|
||||
[self setEditing:NO];
|
||||
[self cancelEditionMode:isRefreshPending];
|
||||
}];
|
||||
}
|
||||
else
|
||||
{
|
||||
// Leave editing mode
|
||||
[self setEditing:NO];
|
||||
[self cancelEditionMode:isRefreshPending];
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -963,15 +970,14 @@
|
||||
[self stopActivityIndicator];
|
||||
|
||||
// Force table refresh
|
||||
editedRoomId = nil;
|
||||
[self refreshRecentsTable];
|
||||
[self cancelEditionMode:YES];
|
||||
|
||||
}];
|
||||
}
|
||||
else
|
||||
{
|
||||
// Leave editing mode
|
||||
[self setEditing:NO];
|
||||
[self cancelEditionMode:isRefreshPending];
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -991,7 +997,7 @@
|
||||
[self stopActivityIndicator];
|
||||
|
||||
// Leave editing mode
|
||||
[self setEditing:NO];
|
||||
[self cancelEditionMode:isRefreshPending];
|
||||
|
||||
|
||||
} failure:^(NSError *error) {
|
||||
@@ -1004,14 +1010,14 @@
|
||||
[[NSNotificationCenter defaultCenter] postNotificationName:kMXKErrorNotification object:error];
|
||||
|
||||
// Leave editing mode
|
||||
[self setEditing:NO];
|
||||
[self cancelEditionMode:isRefreshPending];
|
||||
|
||||
}];
|
||||
}
|
||||
else
|
||||
{
|
||||
// Leave editing mode
|
||||
[self setEditing:NO];
|
||||
[self cancelEditionMode:isRefreshPending];
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -1033,7 +1039,7 @@
|
||||
[self stopActivityIndicator];
|
||||
|
||||
// Leave editing mode
|
||||
[self setEditing:NO];
|
||||
[self cancelEditionMode:isRefreshPending];
|
||||
|
||||
}];
|
||||
}
|
||||
@@ -1044,7 +1050,7 @@
|
||||
[self stopActivityIndicator];
|
||||
|
||||
// Leave editing mode
|
||||
[self setEditing:NO];
|
||||
[self cancelEditionMode:isRefreshPending];
|
||||
|
||||
}];
|
||||
}
|
||||
@@ -1052,7 +1058,7 @@
|
||||
else
|
||||
{
|
||||
// Leave editing mode
|
||||
[self setEditing:NO];
|
||||
[self cancelEditionMode:isRefreshPending];
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -1658,7 +1664,12 @@
|
||||
[currentAlert showInViewController:self];
|
||||
}
|
||||
|
||||
#pragma mark - Table view scroll handling
|
||||
#pragma mark - Table view scrolling
|
||||
|
||||
- (void)scrollToTop:(BOOL)animated
|
||||
{
|
||||
[self.recentsTableView setContentOffset:CGPointMake(-self.recentsTableView.contentInset.left, -self.recentsTableView.contentInset.top) animated:animated];
|
||||
}
|
||||
|
||||
- (void)scrollToTheTopTheNextRoomWithMissedNotificationsInSection:(NSInteger)section
|
||||
{
|
||||
|
||||
@@ -32,6 +32,8 @@
|
||||
@property (weak, nonatomic) IBOutlet UILabel *roomTitle1;
|
||||
@property (weak, nonatomic) IBOutlet UILabel *roomTitle2;
|
||||
|
||||
@property (weak, nonatomic) IBOutlet UIView *editionArrowView;
|
||||
|
||||
@property (weak, nonatomic) IBOutlet UIView *directRoomBorderView;
|
||||
@property (weak, nonatomic) IBOutlet MXKImageView *roomAvatar;
|
||||
@property (weak, nonatomic) IBOutlet UIImageView *encryptedRoomIcon;
|
||||
@@ -40,6 +42,10 @@
|
||||
@property (weak, nonatomic) IBOutlet UIView *missedNotifAndUnreadBadgeBgView;
|
||||
@property (weak, nonatomic) IBOutlet NSLayoutConstraint *missedNotifAndUnreadBadgeBgViewWidthConstraint;
|
||||
|
||||
@property (nonatomic, readonly) NSString *roomId;
|
||||
|
||||
@property (nonatomic) NSInteger collectionViewTag; // default is -1
|
||||
|
||||
/**
|
||||
The default collection view cell size.
|
||||
*/
|
||||
|
||||
@@ -53,6 +53,18 @@
|
||||
|
||||
// Disable the user interaction on the room avatar.
|
||||
self.roomAvatar.userInteractionEnabled = NO;
|
||||
|
||||
// define arrow mask
|
||||
CAShapeLayer *arrowMaskLayer = [[CAShapeLayer alloc] init];
|
||||
arrowMaskLayer.frame = self.editionArrowView.bounds;
|
||||
CGSize viewSize = self.editionArrowView.frame.size;
|
||||
UIBezierPath *path = [[UIBezierPath alloc] init];
|
||||
[path moveToPoint:CGPointMake(0, viewSize.height)]; // arrow left bottom point
|
||||
[path addLineToPoint:CGPointMake(viewSize.width / 2, 0)]; // arrow head
|
||||
[path addLineToPoint:CGPointMake(viewSize.width, viewSize.height)]; // arrow right bottom point
|
||||
[path closePath]; // arrow top side
|
||||
arrowMaskLayer.path = path.CGPath;
|
||||
self.editionArrowView.layer.mask = arrowMaskLayer;
|
||||
}
|
||||
|
||||
- (void)layoutSubviews
|
||||
@@ -182,9 +194,21 @@
|
||||
[self removeGestureRecognizer:self.gestureRecognizers[0]];
|
||||
}
|
||||
self.tag = -1;
|
||||
self.collectionViewTag = -1;
|
||||
|
||||
self.editionArrowView.hidden = YES;
|
||||
|
||||
roomCellData = nil;
|
||||
}
|
||||
|
||||
- (NSString*)roomId
|
||||
{
|
||||
if (roomCellData)
|
||||
{
|
||||
return roomCellData.roomSummary.roomId;
|
||||
}
|
||||
return nil;
|
||||
}
|
||||
|
||||
@end
|
||||
|
||||
|
||||
@@ -82,17 +82,27 @@
|
||||
<color key="textColor" red="0.0" green="0.0" blue="0.0" alpha="1" colorSpace="custom" customColorSpace="sRGB"/>
|
||||
<nil key="highlightedColor"/>
|
||||
</label>
|
||||
<view hidden="YES" contentMode="scaleToFill" translatesAutoresizingMaskIntoConstraints="NO" id="jta-3V-4wL">
|
||||
<rect key="frame" x="30" y="105" width="20" height="10"/>
|
||||
<color key="backgroundColor" cocoaTouchSystemColor="groupTableViewBackgroundColor"/>
|
||||
<constraints>
|
||||
<constraint firstAttribute="height" constant="10" id="eU4-Qq-wum"/>
|
||||
<constraint firstAttribute="width" constant="20" id="sH5-UK-Q7A"/>
|
||||
</constraints>
|
||||
</view>
|
||||
</subviews>
|
||||
</view>
|
||||
<constraints>
|
||||
<constraint firstAttribute="trailing" secondItem="5Yd-df-HbB" secondAttribute="trailing" constant="12" id="0gr-xn-dfD"/>
|
||||
<constraint firstAttribute="bottom" relation="greaterThanOrEqual" secondItem="oxX-IL-dG4" secondAttribute="bottom" constant="5" id="1JB-d1-zb9"/>
|
||||
<constraint firstItem="oxX-IL-dG4" firstAttribute="top" secondItem="T1Q-RS-8o6" secondAttribute="bottom" constant="4" id="2DB-H2-E2v"/>
|
||||
<constraint firstAttribute="bottom" secondItem="jta-3V-4wL" secondAttribute="bottom" id="3rt-Ig-1rG"/>
|
||||
<constraint firstItem="oxX-IL-dG4" firstAttribute="leading" secondItem="eCk-zY-LXq" secondAttribute="leading" constant="4" id="6gu-JD-Gb1"/>
|
||||
<constraint firstItem="X8H-1U-wc3" firstAttribute="centerX" secondItem="oxX-IL-dG4" secondAttribute="centerX" id="K9T-eO-WNb"/>
|
||||
<constraint firstItem="xws-BR-H47" firstAttribute="centerX" secondItem="T1Q-RS-8o6" secondAttribute="centerX" id="Lo3-Ov-Bw8"/>
|
||||
<constraint firstAttribute="trailing" secondItem="Q6g-b0-3sZ" secondAttribute="trailing" id="Mf1-H6-oH4"/>
|
||||
<constraint firstItem="Jkz-Zp-aaG" firstAttribute="centerX" secondItem="oxX-IL-dG4" secondAttribute="centerX" id="OQy-tF-e3Z"/>
|
||||
<constraint firstItem="jta-3V-4wL" firstAttribute="centerX" secondItem="eCk-zY-LXq" secondAttribute="centerX" id="R87-mq-SlO"/>
|
||||
<constraint firstItem="Jkz-Zp-aaG" firstAttribute="top" secondItem="X8H-1U-wc3" secondAttribute="bottom" id="XDO-yX-Zs5"/>
|
||||
<constraint firstItem="X8H-1U-wc3" firstAttribute="leading" secondItem="eCk-zY-LXq" secondAttribute="leading" constant="7" id="XU5-Lv-9Xn"/>
|
||||
<constraint firstItem="T1Q-RS-8o6" firstAttribute="top" secondItem="eCk-zY-LXq" secondAttribute="top" constant="10" id="cc7-bg-15Z"/>
|
||||
@@ -108,6 +118,7 @@
|
||||
</constraints>
|
||||
<connections>
|
||||
<outlet property="directRoomBorderView" destination="xws-BR-H47" id="34A-hu-DXq"/>
|
||||
<outlet property="editionArrowView" destination="jta-3V-4wL" id="XLj-Cx-3bn"/>
|
||||
<outlet property="encryptedRoomIcon" destination="5Yd-df-HbB" id="5pc-Vi-wMZ"/>
|
||||
<outlet property="missedNotifAndUnreadBadgeBgView" destination="Q6g-b0-3sZ" id="jNG-dA-dfP"/>
|
||||
<outlet property="missedNotifAndUnreadBadgeBgViewWidthConstraint" destination="jeX-st-swl" id="4sa-wn-bgT"/>
|
||||
|
||||
@@ -20,4 +20,17 @@
|
||||
|
||||
@property (strong, nonatomic) IBOutlet UICollectionView *collectionView;
|
||||
|
||||
@property (strong, nonatomic) IBOutlet UIView *editionView;
|
||||
@property (weak, nonatomic) IBOutlet NSLayoutConstraint *editionViewHeightConstraint;
|
||||
@property (weak, nonatomic) IBOutlet UIButton *directChatButton;
|
||||
@property (weak, nonatomic) IBOutlet UIImageView *directChatImageView;
|
||||
@property (weak, nonatomic) IBOutlet UIButton *notificationsButton;
|
||||
@property (weak, nonatomic) IBOutlet UIImageView *notificationsImageView;
|
||||
@property (weak, nonatomic) IBOutlet UIButton *favouriteButton;
|
||||
@property (weak, nonatomic) IBOutlet UIImageView *favouriteImageView;
|
||||
@property (weak, nonatomic) IBOutlet UIButton *priorityButton;
|
||||
@property (weak, nonatomic) IBOutlet UIImageView *priorityImageView;
|
||||
@property (weak, nonatomic) IBOutlet UIButton *leaveButton;
|
||||
@property (weak, nonatomic) IBOutlet UIImageView *leaveImageView;
|
||||
|
||||
@end
|
||||
|
||||
@@ -18,6 +18,13 @@
|
||||
|
||||
@implementation TableViewCellWithCollectionView
|
||||
|
||||
- (void)awakeFromNib
|
||||
{
|
||||
[super awakeFromNib];
|
||||
|
||||
self.editionViewHeightConstraint.constant = 0;
|
||||
}
|
||||
|
||||
- (void)prepareForReuse
|
||||
{
|
||||
[super prepareForReuse];
|
||||
@@ -25,6 +32,11 @@
|
||||
self.collectionView.tag = -1;
|
||||
self.collectionView.dataSource = nil;
|
||||
self.collectionView.delegate = nil;
|
||||
|
||||
self.editionViewHeightConstraint.constant = 0;
|
||||
self.editionView.hidden = YES;
|
||||
|
||||
self.collectionView.scrollEnabled = YES;
|
||||
}
|
||||
|
||||
@end
|
||||
|
||||
@@ -1,25 +1,25 @@
|
||||
<?xml version="1.0" encoding="UTF-8"?>
|
||||
<document type="com.apple.InterfaceBuilder3.CocoaTouch.XIB" version="3.0" toolsVersion="12120" systemVersion="16E195" targetRuntime="iOS.CocoaTouch" propertyAccessControl="none" useAutolayout="YES" useTraitCollections="YES" colorMatched="YES">
|
||||
<document type="com.apple.InterfaceBuilder3.CocoaTouch.XIB" version="3.0" toolsVersion="12121" systemVersion="16F73" targetRuntime="iOS.CocoaTouch" propertyAccessControl="none" useAutolayout="YES" useTraitCollections="YES" colorMatched="YES">
|
||||
<device id="retina4_7" orientation="portrait">
|
||||
<adaptation id="fullscreen"/>
|
||||
</device>
|
||||
<dependencies>
|
||||
<deployment identifier="iOS"/>
|
||||
<plugIn identifier="com.apple.InterfaceBuilder.IBCocoaTouchPlugin" version="12088"/>
|
||||
<plugIn identifier="com.apple.InterfaceBuilder.IBCocoaTouchPlugin" version="12089"/>
|
||||
<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="none" indentationWidth="10" id="20U-7H-xmi" customClass="TableViewCellWithCollectionView">
|
||||
<rect key="frame" x="0.0" y="0.0" width="600" height="110"/>
|
||||
<rect key="frame" x="0.0" y="0.0" width="600" height="180"/>
|
||||
<autoresizingMask key="autoresizingMask"/>
|
||||
<tableViewCellContentView key="contentView" opaque="NO" clipsSubviews="YES" multipleTouchEnabled="YES" contentMode="center" tableViewCell="20U-7H-xmi" id="cFw-g7-Cgn">
|
||||
<rect key="frame" x="0.0" y="0.0" width="600" height="109.5"/>
|
||||
<rect key="frame" x="0.0" y="0.0" width="600" height="180"/>
|
||||
<autoresizingMask key="autoresizingMask"/>
|
||||
<subviews>
|
||||
<collectionView clipsSubviews="YES" multipleTouchEnabled="YES" contentMode="scaleToFill" showsHorizontalScrollIndicator="NO" showsVerticalScrollIndicator="NO" dataMode="none" translatesAutoresizingMaskIntoConstraints="NO" id="iXt-1Y-bEu">
|
||||
<rect key="frame" x="0.0" y="0.0" width="600" height="109.5"/>
|
||||
<rect key="frame" x="0.0" y="0.0" width="600" height="114.5"/>
|
||||
<color key="backgroundColor" white="1" alpha="1" colorSpace="calibratedWhite"/>
|
||||
<collectionViewFlowLayout key="collectionViewLayout" scrollDirection="horizontal" minimumLineSpacing="10" minimumInteritemSpacing="10" id="zZI-Za-2q1">
|
||||
<size key="itemSize" width="50" height="50"/>
|
||||
@@ -28,18 +28,133 @@
|
||||
<inset key="sectionInset" minX="0.0" minY="0.0" maxX="0.0" maxY="0.0"/>
|
||||
</collectionViewFlowLayout>
|
||||
</collectionView>
|
||||
<view hidden="YES" contentMode="scaleToFill" translatesAutoresizingMaskIntoConstraints="NO" id="K7T-mO-6FZ">
|
||||
<rect key="frame" x="15" y="114.5" width="570" height="60"/>
|
||||
<subviews>
|
||||
<button opaque="NO" contentMode="scaleToFill" contentHorizontalAlignment="center" contentVerticalAlignment="center" lineBreakMode="middleTruncation" translatesAutoresizingMaskIntoConstraints="NO" id="R8G-pa-NMv">
|
||||
<rect key="frame" x="160" y="0.0" width="50" height="60"/>
|
||||
<constraints>
|
||||
<constraint firstAttribute="width" constant="50" id="UaQ-bI-bWg"/>
|
||||
</constraints>
|
||||
</button>
|
||||
<imageView userInteractionEnabled="NO" contentMode="center" horizontalHuggingPriority="251" verticalHuggingPriority="251" image="directChatOff.png" translatesAutoresizingMaskIntoConstraints="NO" id="zv7-4U-qzL">
|
||||
<rect key="frame" x="165" y="10" width="40" height="40"/>
|
||||
<constraints>
|
||||
<constraint firstAttribute="width" constant="40" id="HVn-3g-jMX"/>
|
||||
<constraint firstAttribute="height" constant="40" id="bpx-O5-PjI"/>
|
||||
</constraints>
|
||||
</imageView>
|
||||
<button opaque="NO" contentMode="scaleToFill" contentHorizontalAlignment="center" contentVerticalAlignment="center" lineBreakMode="middleTruncation" translatesAutoresizingMaskIntoConstraints="NO" id="dsz-Yx-goM">
|
||||
<rect key="frame" x="210" y="0.0" width="50" height="60"/>
|
||||
</button>
|
||||
<imageView userInteractionEnabled="NO" contentMode="center" horizontalHuggingPriority="251" verticalHuggingPriority="251" image="notificationsOff.png" translatesAutoresizingMaskIntoConstraints="NO" id="LJb-Om-aCu">
|
||||
<rect key="frame" x="215" y="10" width="40" height="40"/>
|
||||
<constraints>
|
||||
<constraint firstAttribute="width" constant="40" id="Bxy-g5-Fm8"/>
|
||||
<constraint firstAttribute="height" constant="40" id="vMe-li-Csc"/>
|
||||
</constraints>
|
||||
</imageView>
|
||||
<button opaque="NO" contentMode="scaleToFill" contentHorizontalAlignment="center" contentVerticalAlignment="center" lineBreakMode="middleTruncation" translatesAutoresizingMaskIntoConstraints="NO" id="MbR-Oe-6k1">
|
||||
<rect key="frame" x="260" y="0.0" width="50" height="60"/>
|
||||
</button>
|
||||
<imageView userInteractionEnabled="NO" contentMode="center" horizontalHuggingPriority="251" verticalHuggingPriority="251" image="favouriteOff.png" translatesAutoresizingMaskIntoConstraints="NO" id="f0O-Nh-XqH">
|
||||
<rect key="frame" x="265" y="10" width="40" height="40"/>
|
||||
<constraints>
|
||||
<constraint firstAttribute="width" constant="40" id="hss-6b-AOg"/>
|
||||
<constraint firstAttribute="height" constant="40" id="l5c-27-8sL"/>
|
||||
</constraints>
|
||||
</imageView>
|
||||
<button opaque="NO" contentMode="scaleToFill" contentHorizontalAlignment="center" contentVerticalAlignment="center" lineBreakMode="middleTruncation" translatesAutoresizingMaskIntoConstraints="NO" id="BsI-jp-frH">
|
||||
<rect key="frame" x="310" y="0.0" width="50" height="60"/>
|
||||
</button>
|
||||
<imageView userInteractionEnabled="NO" contentMode="center" horizontalHuggingPriority="251" verticalHuggingPriority="251" image="priorityLow.png" translatesAutoresizingMaskIntoConstraints="NO" id="uJK-LE-Vkz">
|
||||
<rect key="frame" x="320" y="10" width="40" height="40"/>
|
||||
<constraints>
|
||||
<constraint firstAttribute="height" constant="40" id="YvB-as-G5U"/>
|
||||
<constraint firstAttribute="width" constant="40" id="ez7-fJ-00U"/>
|
||||
</constraints>
|
||||
</imageView>
|
||||
<button opaque="NO" contentMode="scaleToFill" contentHorizontalAlignment="center" contentVerticalAlignment="center" lineBreakMode="middleTruncation" translatesAutoresizingMaskIntoConstraints="NO" id="uG0-u6-BBj">
|
||||
<rect key="frame" x="360" y="0.0" width="50" height="60"/>
|
||||
</button>
|
||||
<imageView userInteractionEnabled="NO" contentMode="center" horizontalHuggingPriority="251" verticalHuggingPriority="251" image="leave.png" translatesAutoresizingMaskIntoConstraints="NO" id="cgb-3x-9qQ">
|
||||
<rect key="frame" x="365" y="10" width="40" height="40"/>
|
||||
<constraints>
|
||||
<constraint firstAttribute="height" constant="40" id="52j-He-vyg"/>
|
||||
<constraint firstAttribute="width" constant="40" id="uNs-tE-9V0"/>
|
||||
</constraints>
|
||||
</imageView>
|
||||
</subviews>
|
||||
<color key="backgroundColor" cocoaTouchSystemColor="groupTableViewBackgroundColor"/>
|
||||
<constraints>
|
||||
<constraint firstItem="f0O-Nh-XqH" firstAttribute="centerX" secondItem="MbR-Oe-6k1" secondAttribute="centerX" id="0NZ-qp-2Nk"/>
|
||||
<constraint firstItem="cgb-3x-9qQ" firstAttribute="centerX" secondItem="uG0-u6-BBj" secondAttribute="centerX" id="2xF-Df-927"/>
|
||||
<constraint firstItem="uG0-u6-BBj" firstAttribute="top" secondItem="K7T-mO-6FZ" secondAttribute="top" id="8bo-ct-uMg"/>
|
||||
<constraint firstAttribute="height" constant="60" id="9CM-a2-YHI"/>
|
||||
<constraint firstItem="BsI-jp-frH" firstAttribute="leading" secondItem="MbR-Oe-6k1" secondAttribute="trailing" id="9rP-eq-5jo"/>
|
||||
<constraint firstAttribute="bottom" secondItem="R8G-pa-NMv" secondAttribute="bottom" id="A82-Wz-NKQ"/>
|
||||
<constraint firstItem="MbR-Oe-6k1" firstAttribute="top" secondItem="K7T-mO-6FZ" secondAttribute="top" id="Gsz-Mi-vly"/>
|
||||
<constraint firstItem="LJb-Om-aCu" firstAttribute="centerX" secondItem="dsz-Yx-goM" secondAttribute="centerX" id="GzS-3I-wFP"/>
|
||||
<constraint firstItem="MbR-Oe-6k1" firstAttribute="height" secondItem="R8G-pa-NMv" secondAttribute="height" id="ItY-Q3-8Ca"/>
|
||||
<constraint firstItem="dsz-Yx-goM" firstAttribute="width" secondItem="R8G-pa-NMv" secondAttribute="width" id="JGH-mk-ZTy"/>
|
||||
<constraint firstItem="zv7-4U-qzL" firstAttribute="centerY" secondItem="R8G-pa-NMv" secondAttribute="centerY" id="Nv5-ki-V3e"/>
|
||||
<constraint firstItem="MbR-Oe-6k1" firstAttribute="centerX" secondItem="K7T-mO-6FZ" secondAttribute="centerX" id="Rcn-Rq-eJZ"/>
|
||||
<constraint firstItem="uG0-u6-BBj" firstAttribute="height" secondItem="R8G-pa-NMv" secondAttribute="height" id="SHZ-pY-q4w"/>
|
||||
<constraint firstItem="dsz-Yx-goM" firstAttribute="height" secondItem="R8G-pa-NMv" secondAttribute="height" id="Vli-GP-zt8"/>
|
||||
<constraint firstItem="uJK-LE-Vkz" firstAttribute="centerY" secondItem="BsI-jp-frH" secondAttribute="centerY" id="XGA-IL-UX0"/>
|
||||
<constraint firstItem="f0O-Nh-XqH" firstAttribute="centerY" secondItem="MbR-Oe-6k1" secondAttribute="centerY" id="YH2-gI-0cy"/>
|
||||
<constraint firstAttribute="width" relation="greaterThanOrEqual" constant="250" id="ZQY-22-SP8"/>
|
||||
<constraint firstItem="BsI-jp-frH" firstAttribute="top" secondItem="K7T-mO-6FZ" secondAttribute="top" id="Zf4-A0-5B6"/>
|
||||
<constraint firstItem="uG0-u6-BBj" firstAttribute="width" secondItem="R8G-pa-NMv" secondAttribute="width" id="ZfC-aM-nvR"/>
|
||||
<constraint firstItem="dsz-Yx-goM" firstAttribute="top" secondItem="K7T-mO-6FZ" secondAttribute="top" id="aR1-bU-0ki"/>
|
||||
<constraint firstItem="cgb-3x-9qQ" firstAttribute="centerY" secondItem="uG0-u6-BBj" secondAttribute="centerY" id="dt3-z9-EgC"/>
|
||||
<constraint firstItem="MbR-Oe-6k1" firstAttribute="leading" secondItem="dsz-Yx-goM" secondAttribute="trailing" id="k4f-Rk-u50"/>
|
||||
<constraint firstItem="zv7-4U-qzL" firstAttribute="centerX" secondItem="R8G-pa-NMv" secondAttribute="centerX" id="kGl-Yz-qso"/>
|
||||
<constraint firstItem="LJb-Om-aCu" firstAttribute="centerY" secondItem="dsz-Yx-goM" secondAttribute="centerY" id="krR-V4-aQX"/>
|
||||
<constraint firstItem="R8G-pa-NMv" firstAttribute="top" secondItem="K7T-mO-6FZ" secondAttribute="top" id="kw3-VE-urz"/>
|
||||
<constraint firstItem="BsI-jp-frH" firstAttribute="width" secondItem="R8G-pa-NMv" secondAttribute="width" id="mig-Wk-n7S"/>
|
||||
<constraint firstItem="dsz-Yx-goM" firstAttribute="leading" secondItem="R8G-pa-NMv" secondAttribute="trailing" id="pfB-6o-vIr"/>
|
||||
<constraint firstItem="MbR-Oe-6k1" firstAttribute="width" secondItem="R8G-pa-NMv" secondAttribute="width" id="sBc-Ow-YIB"/>
|
||||
<constraint firstItem="BsI-jp-frH" firstAttribute="height" secondItem="R8G-pa-NMv" secondAttribute="height" id="ub9-qy-AoE"/>
|
||||
<constraint firstItem="uJK-LE-Vkz" firstAttribute="trailing" secondItem="BsI-jp-frH" secondAttribute="trailing" id="yTj-PM-CTK"/>
|
||||
<constraint firstItem="uG0-u6-BBj" firstAttribute="leading" secondItem="BsI-jp-frH" secondAttribute="trailing" id="zU8-FO-eQH"/>
|
||||
</constraints>
|
||||
</view>
|
||||
</subviews>
|
||||
<constraints>
|
||||
<constraint firstAttribute="bottom" secondItem="iXt-1Y-bEu" secondAttribute="bottom" id="Rtx-zg-IZA"/>
|
||||
<constraint firstAttribute="trailing" secondItem="K7T-mO-6FZ" secondAttribute="trailing" priority="750" constant="15" id="Idw-N1-mWl"/>
|
||||
<constraint firstAttribute="bottom" secondItem="K7T-mO-6FZ" secondAttribute="bottom" constant="5" id="PQs-Ra-gvO"/>
|
||||
<constraint firstItem="iXt-1Y-bEu" firstAttribute="top" secondItem="cFw-g7-Cgn" secondAttribute="top" id="eEg-xT-ju4"/>
|
||||
<constraint firstAttribute="trailing" secondItem="iXt-1Y-bEu" secondAttribute="trailing" id="lAZ-3p-GBF"/>
|
||||
<constraint firstItem="iXt-1Y-bEu" firstAttribute="leading" secondItem="cFw-g7-Cgn" secondAttribute="leading" id="n3c-tX-orx"/>
|
||||
<constraint firstItem="K7T-mO-6FZ" firstAttribute="leading" secondItem="cFw-g7-Cgn" secondAttribute="leading" priority="750" constant="15" id="qsD-XL-pWO"/>
|
||||
<constraint firstItem="K7T-mO-6FZ" firstAttribute="top" secondItem="iXt-1Y-bEu" secondAttribute="bottom" id="rlu-of-Bq8"/>
|
||||
</constraints>
|
||||
</tableViewCellContentView>
|
||||
<accessibility key="accessibilityConfiguration" identifier="TableViewCell"/>
|
||||
<connections>
|
||||
<outlet property="collectionView" destination="iXt-1Y-bEu" id="4ms-f4-dIa"/>
|
||||
<outlet property="directChatButton" destination="R8G-pa-NMv" id="q3c-wK-rRU"/>
|
||||
<outlet property="directChatImageView" destination="zv7-4U-qzL" id="qnw-jg-llE"/>
|
||||
<outlet property="editionView" destination="K7T-mO-6FZ" id="Mjq-oL-nfX"/>
|
||||
<outlet property="editionViewHeightConstraint" destination="9CM-a2-YHI" id="FqF-q8-RbP"/>
|
||||
<outlet property="favouriteButton" destination="MbR-Oe-6k1" id="9Jb-dQ-FIX"/>
|
||||
<outlet property="favouriteImageView" destination="f0O-Nh-XqH" id="Eof-Xy-czp"/>
|
||||
<outlet property="leaveButton" destination="uG0-u6-BBj" id="xLr-sD-Xcn"/>
|
||||
<outlet property="leaveImageView" destination="cgb-3x-9qQ" id="peV-J5-Lnn"/>
|
||||
<outlet property="notificationsButton" destination="dsz-Yx-goM" id="oET-UR-6bm"/>
|
||||
<outlet property="notificationsImageView" destination="LJb-Om-aCu" id="R7K-zK-BwI"/>
|
||||
<outlet property="priorityButton" destination="BsI-jp-frH" id="bFI-0y-EqY"/>
|
||||
<outlet property="priorityImageView" destination="uJK-LE-Vkz" id="ugK-Gs-l9M"/>
|
||||
</connections>
|
||||
<point key="canvasLocation" x="25" y="52.5"/>
|
||||
</tableViewCell>
|
||||
</objects>
|
||||
<resources>
|
||||
<image name="directChatOff.png" width="32" height="32"/>
|
||||
<image name="favouriteOff.png" width="33" height="29"/>
|
||||
<image name="leave.png" width="25" height="24"/>
|
||||
<image name="notificationsOff.png" width="29" height="32"/>
|
||||
<image name="priorityLow.png" width="31" height="24"/>
|
||||
</resources>
|
||||
</document>
|
||||
|
||||
Reference in New Issue
Block a user