mirror of
https://gitlab.opencode.de/bwi/bundesmessenger/clients/bundesmessenger-ios.git
synced 2026-04-21 17:12:45 +02:00
Structure project almost by features. Start by organizing view controllers.
This commit is contained in:
@@ -0,0 +1,66 @@
|
||||
/*
|
||||
Copyright 2017 Vector Creations Ltd
|
||||
|
||||
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 <MatrixKit/MatrixKit.h>
|
||||
|
||||
@interface BugReportViewController : MXKViewController <UITextViewDelegate>
|
||||
|
||||
@property (weak, nonatomic) IBOutlet UIScrollView *scrollView;
|
||||
@property (weak, nonatomic) IBOutlet NSLayoutConstraint *scrollViewBottomConstraint;
|
||||
|
||||
@property (weak, nonatomic) IBOutlet UIView *containerView;
|
||||
@property (weak, nonatomic) IBOutlet UILabel *titleLabel;
|
||||
|
||||
@property (weak, nonatomic) IBOutlet UIView *bugDescriptionContainer;
|
||||
|
||||
@property (weak, nonatomic) IBOutlet UILabel *descriptionLabel;
|
||||
@property (weak, nonatomic) IBOutlet UITextView *bugReportDescriptionTextView;
|
||||
@property (weak, nonatomic) IBOutlet UILabel *logsDescriptionLabel;
|
||||
|
||||
@property (weak, nonatomic) IBOutlet UIView *sendLogsContainer;
|
||||
@property (weak, nonatomic) IBOutlet UILabel *sendLogsLabel;
|
||||
@property (weak, nonatomic) IBOutlet UIImageView *sendLogsButtonImage;
|
||||
|
||||
@property (weak, nonatomic) IBOutlet UIView *sendScreenshotContainer;
|
||||
@property (weak, nonatomic) IBOutlet NSLayoutConstraint *sendScreenshotContainerHeightConstraint;
|
||||
@property (weak, nonatomic) IBOutlet UILabel *sendScreenshotLabel;
|
||||
@property (weak, nonatomic) IBOutlet UIImageView *sendScreenshotButtonImage;
|
||||
|
||||
@property (weak, nonatomic) IBOutlet UIView *sendingContainer;
|
||||
@property (weak, nonatomic) IBOutlet UILabel *sendingLabel;
|
||||
@property (weak, nonatomic) IBOutlet UIProgressView *sendingProgress;
|
||||
|
||||
@property (weak, nonatomic) IBOutlet UIButton *cancelButton;
|
||||
@property (weak, nonatomic) IBOutlet UIButton *sendButton;
|
||||
|
||||
+ (instancetype)bugReportViewController;
|
||||
|
||||
- (void)showInViewController:(UIViewController*)viewController;
|
||||
|
||||
/**
|
||||
The screenshot to send with the bug report.
|
||||
*/
|
||||
@property (nonatomic) UIImage *screenshot;
|
||||
|
||||
/**
|
||||
Option to report a crash.
|
||||
The crash log will sent in the report.
|
||||
*/
|
||||
@property (nonatomic) BOOL reportCrash;
|
||||
|
||||
@end
|
||||
@@ -0,0 +1,446 @@
|
||||
/*
|
||||
Copyright 2017 Vector Creations Ltd
|
||||
|
||||
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 "BugReportViewController.h"
|
||||
|
||||
#import "AppDelegate.h"
|
||||
|
||||
#import "GBDeviceInfo_iOS.h"
|
||||
|
||||
@interface BugReportViewController ()
|
||||
{
|
||||
MXBugReportRestClient *bugReportRestClient;
|
||||
|
||||
// The temporary file used to store the screenshot
|
||||
NSURL *screenShotFile;
|
||||
|
||||
// Observe kRiotDesignValuesDidChangeThemeNotification to handle user interface theme change.
|
||||
id kRiotDesignValuesDidChangeThemeNotificationObserver;
|
||||
}
|
||||
|
||||
@property (nonatomic) BOOL sendLogs;
|
||||
@property (nonatomic) BOOL sendScreenshot;
|
||||
|
||||
@property (weak, nonatomic) IBOutlet UIView *overlayView;
|
||||
|
||||
@end
|
||||
|
||||
@implementation BugReportViewController
|
||||
|
||||
#pragma mark - Class methods
|
||||
|
||||
+ (UINib *)nib
|
||||
{
|
||||
return [UINib nibWithNibName:NSStringFromClass([BugReportViewController class])
|
||||
bundle:[NSBundle bundleForClass:[BugReportViewController class]]];
|
||||
}
|
||||
|
||||
+ (instancetype)bugReportViewController
|
||||
{
|
||||
return [[[self class] alloc] initWithNibName:NSStringFromClass([BugReportViewController class])
|
||||
bundle:[NSBundle bundleForClass:[BugReportViewController class]]];
|
||||
}
|
||||
|
||||
#pragma mark -
|
||||
|
||||
- (void)showInViewController:(UIViewController *)viewController
|
||||
{
|
||||
self.providesPresentationContextTransitionStyle = YES;
|
||||
self.definesPresentationContext = YES;
|
||||
self.modalPresentationStyle = UIModalPresentationOverFullScreen;
|
||||
self.modalTransitionStyle = UIModalTransitionStyleCrossDissolve;
|
||||
|
||||
[viewController presentViewController:self animated:YES completion:nil];
|
||||
}
|
||||
|
||||
- (void)viewDidLoad
|
||||
{
|
||||
[super viewDidLoad];
|
||||
|
||||
_logsDescriptionLabel.text = NSLocalizedStringFromTable(@"bug_report_logs_description", @"Vector", nil);
|
||||
_sendLogsLabel.text = NSLocalizedStringFromTable(@"bug_report_send_logs", @"Vector", nil);
|
||||
_sendScreenshotLabel.text = NSLocalizedStringFromTable(@"bug_report_send_screenshot", @"Vector", nil);
|
||||
|
||||
_containerView.layer.cornerRadius = 20;
|
||||
|
||||
_bugReportDescriptionTextView.layer.borderWidth = 1.0f;
|
||||
_bugReportDescriptionTextView.text = nil;
|
||||
_bugReportDescriptionTextView.delegate = self;
|
||||
|
||||
if (_reportCrash)
|
||||
{
|
||||
_titleLabel.text = NSLocalizedStringFromTable(@"bug_crash_report_title", @"Vector", nil);
|
||||
_descriptionLabel.text = NSLocalizedStringFromTable(@"bug_crash_report_description", @"Vector", nil);
|
||||
}
|
||||
else
|
||||
{
|
||||
_titleLabel.text = NSLocalizedStringFromTable(@"bug_report_title", @"Vector", nil);
|
||||
_descriptionLabel.text = NSLocalizedStringFromTable(@"bug_report_description", @"Vector", nil);
|
||||
}
|
||||
|
||||
[_cancelButton setTitle:[NSBundle mxk_localizedStringForKey:@"cancel"] forState:UIControlStateNormal];
|
||||
[_cancelButton setTitle:[NSBundle mxk_localizedStringForKey:@"cancel"] forState:UIControlStateHighlighted];
|
||||
[_sendButton setTitle:NSLocalizedStringFromTable(@"bug_report_send", @"Vector", nil) forState:UIControlStateNormal];
|
||||
[_sendButton setTitle:NSLocalizedStringFromTable(@"bug_report_send", @"Vector", nil) forState:UIControlStateHighlighted];
|
||||
|
||||
// Do not send empty report
|
||||
_sendButton.enabled = NO;;
|
||||
|
||||
_sendingContainer.hidden = YES;
|
||||
|
||||
self.sendLogs = YES;
|
||||
self.sendScreenshot = YES;
|
||||
|
||||
// Hide the screenshot button if there is no screenshot
|
||||
if (!_screenshot)
|
||||
{
|
||||
_sendScreenshotContainer.hidden = YES;
|
||||
_sendScreenshotContainerHeightConstraint.constant = 0;
|
||||
}
|
||||
|
||||
// Listen to sendLogs tap
|
||||
UITapGestureRecognizer *sendLogsTapGesture = [[UITapGestureRecognizer alloc] initWithTarget:self action:@selector(onSendLogsTap:)];
|
||||
[sendLogsTapGesture setNumberOfTouchesRequired:1];
|
||||
[_sendLogsContainer addGestureRecognizer:sendLogsTapGesture];
|
||||
_sendLogsContainer.userInteractionEnabled = YES;
|
||||
|
||||
// Listen to sendScreenshot tap
|
||||
UITapGestureRecognizer *sendScreenshotTapGesture = [[UITapGestureRecognizer alloc] initWithTarget:self action:@selector(onSendScreenshotTap:)];
|
||||
[sendScreenshotTapGesture setNumberOfTouchesRequired:1];
|
||||
[_sendScreenshotContainer addGestureRecognizer:sendScreenshotTapGesture];
|
||||
_sendScreenshotContainer.userInteractionEnabled = YES;
|
||||
|
||||
// Add an accessory view in order to retrieve keyboard view
|
||||
_bugReportDescriptionTextView.inputAccessoryView = [[UIView alloc] initWithFrame:CGRectZero];
|
||||
|
||||
// Observe user interface theme change.
|
||||
kRiotDesignValuesDidChangeThemeNotificationObserver = [[NSNotificationCenter defaultCenter] addObserverForName:kRiotDesignValuesDidChangeThemeNotification object:nil queue:[NSOperationQueue mainQueue] usingBlock:^(NSNotification *notif) {
|
||||
|
||||
[self userInterfaceThemeDidChange];
|
||||
|
||||
}];
|
||||
[self userInterfaceThemeDidChange];
|
||||
}
|
||||
|
||||
- (void)userInterfaceThemeDidChange
|
||||
{
|
||||
self.defaultBarTintColor = kRiotSecondaryBgColor;
|
||||
self.barTitleColor = kRiotPrimaryTextColor;
|
||||
self.activityIndicator.backgroundColor = kRiotOverlayColor;
|
||||
|
||||
self.overlayView.backgroundColor = kRiotOverlayColor;
|
||||
self.overlayView.alpha = 1.0;
|
||||
|
||||
self.containerView.backgroundColor = kRiotPrimaryBgColor;
|
||||
self.sendingContainer.backgroundColor = kRiotPrimaryBgColor;
|
||||
|
||||
self.bugReportDescriptionTextView.keyboardAppearance = kRiotKeyboard;
|
||||
|
||||
self.titleLabel.textColor = kRiotPrimaryTextColor;
|
||||
self.sendingLabel.textColor = kRiotPrimaryTextColor;
|
||||
self.descriptionLabel.textColor = kRiotPrimaryTextColor;
|
||||
self.bugReportDescriptionTextView.textColor = kRiotPrimaryTextColor;
|
||||
self.bugReportDescriptionTextView.tintColor = kRiotColorGreen;
|
||||
self.logsDescriptionLabel.textColor = kRiotPrimaryTextColor;
|
||||
self.sendLogsLabel.textColor = kRiotPrimaryTextColor;
|
||||
self.sendScreenshotLabel.textColor = kRiotPrimaryTextColor;
|
||||
|
||||
self.sendButton.tintColor = kRiotColorGreen;
|
||||
self.cancelButton.tintColor = kRiotColorGreen;
|
||||
|
||||
_bugReportDescriptionTextView.layer.borderColor = kRiotSecondaryBgColor.CGColor;
|
||||
}
|
||||
|
||||
- (UIStatusBarStyle)preferredStatusBarStyle
|
||||
{
|
||||
return kRiotDesignStatusBarStyle;
|
||||
}
|
||||
|
||||
- (void)destroy
|
||||
{
|
||||
if (kRiotDesignValuesDidChangeThemeNotificationObserver)
|
||||
{
|
||||
[[NSNotificationCenter defaultCenter] removeObserver:kRiotDesignValuesDidChangeThemeNotificationObserver];
|
||||
kRiotDesignValuesDidChangeThemeNotificationObserver = nil;
|
||||
}
|
||||
|
||||
[super destroy];
|
||||
}
|
||||
|
||||
- (void)dismissViewControllerAnimated:(BOOL)flag completion:(void (^)(void))completion
|
||||
{
|
||||
[super dismissViewControllerAnimated:flag completion:completion];
|
||||
|
||||
[self destroy];
|
||||
}
|
||||
|
||||
- (void)dealloc
|
||||
{
|
||||
_bugReportDescriptionTextView.inputAccessoryView = nil;
|
||||
}
|
||||
|
||||
-(void)viewWillDisappear:(BOOL)animated
|
||||
{
|
||||
[super viewWillDisappear:animated];
|
||||
|
||||
[self dismissKeyboard];
|
||||
|
||||
if (screenShotFile)
|
||||
{
|
||||
[[NSFileManager defaultManager] removeItemAtURL:screenShotFile error:nil];
|
||||
screenShotFile = nil;
|
||||
}
|
||||
}
|
||||
|
||||
- (void)setSendLogs:(BOOL)sendLogs
|
||||
{
|
||||
_sendLogs = sendLogs;
|
||||
if (_sendLogs)
|
||||
{
|
||||
_sendLogsButtonImage.image = [UIImage imageNamed:@"selection_tick"];
|
||||
}
|
||||
else
|
||||
{
|
||||
_sendLogsButtonImage.image = [UIImage imageNamed:@"selection_untick"];
|
||||
}
|
||||
}
|
||||
|
||||
- (void)setSendScreenshot:(BOOL)sendScreenshot
|
||||
{
|
||||
_sendScreenshot = sendScreenshot;
|
||||
if (_sendScreenshot)
|
||||
{
|
||||
_sendScreenshotButtonImage.image = [UIImage imageNamed:@"selection_tick"];
|
||||
}
|
||||
else
|
||||
{
|
||||
_sendScreenshotButtonImage.image = [UIImage imageNamed:@"selection_untick"];
|
||||
}
|
||||
}
|
||||
|
||||
#pragma mark - MXKViewController
|
||||
- (void)dismissKeyboard
|
||||
{
|
||||
// Hide the keyboard
|
||||
[_bugReportDescriptionTextView resignFirstResponder];
|
||||
}
|
||||
|
||||
- (void)onKeyboardShowAnimationComplete
|
||||
{
|
||||
self.keyboardView = _bugReportDescriptionTextView.inputAccessoryView.superview;
|
||||
}
|
||||
|
||||
-(void)setKeyboardHeight:(CGFloat)keyboardHeight
|
||||
{
|
||||
// In portrait in 6/7 and 6+/7+, make the height of the popup smaller to be able to
|
||||
// display Cancel and Send buttons.
|
||||
// Do nothing in landscape or in 5 in portrait and in landscape. There will be not enough
|
||||
// room to display bugReportDescriptionTextView.
|
||||
if (self.view.frame.size.height > 568)
|
||||
{
|
||||
self.scrollViewBottomConstraint.constant = keyboardHeight;
|
||||
}
|
||||
else
|
||||
{
|
||||
self.scrollViewBottomConstraint.constant = 0;
|
||||
}
|
||||
|
||||
[self.view layoutIfNeeded];
|
||||
}
|
||||
|
||||
#pragma mark - UITextViewDelegate
|
||||
|
||||
- (void)textViewDidChange:(UITextView *)textView
|
||||
{
|
||||
_sendButton.enabled = (_bugReportDescriptionTextView.text.length != 0);
|
||||
}
|
||||
|
||||
#pragma mark - User actions
|
||||
|
||||
- (IBAction)onSendButtonPress:(id)sender
|
||||
{
|
||||
_sendButton.hidden = YES;
|
||||
_sendingContainer.hidden = NO;
|
||||
|
||||
// Setup data to send
|
||||
NSString *url = [[NSUserDefaults standardUserDefaults] objectForKey:@"bugReportEndpointUrl"];
|
||||
bugReportRestClient = [[MXBugReportRestClient alloc] initWithBugReportEndpoint:url];
|
||||
|
||||
// App info
|
||||
bugReportRestClient.appName = [[NSUserDefaults standardUserDefaults] objectForKey:@"bugReportApp"]; // Use the name allocated by the bug report server
|
||||
bugReportRestClient.version = [AppDelegate theDelegate].appVersion;
|
||||
bugReportRestClient.build = [AppDelegate theDelegate].build;
|
||||
|
||||
// Device info
|
||||
bugReportRestClient.deviceModel = [GBDeviceInfo deviceInfo].modelString;
|
||||
bugReportRestClient.deviceOS = [NSString stringWithFormat:@"%@ %@", [[UIDevice currentDevice] systemName], [[UIDevice currentDevice] systemVersion]];
|
||||
|
||||
// User info (TODO: handle multi-account and find a way to expose them in rageshake API)
|
||||
NSMutableDictionary *userInfo = [NSMutableDictionary dictionary];
|
||||
MXKAccount *mainAccount = [MXKAccountManager sharedManager].accounts.firstObject;
|
||||
if (mainAccount.mxSession.myUser.userId)
|
||||
{
|
||||
userInfo[@"user_id"] = mainAccount.mxSession.myUser.userId;
|
||||
}
|
||||
if (mainAccount.mxSession.matrixRestClient.credentials.deviceId)
|
||||
{
|
||||
userInfo[@"device_id"] = mainAccount.mxSession.matrixRestClient.credentials.deviceId;
|
||||
}
|
||||
|
||||
userInfo[@"locale"] = [NSLocale preferredLanguages][0];
|
||||
userInfo[@"default_app_language"] = [[NSBundle mainBundle] preferredLocalizations][0]; // The language chosen by the OS
|
||||
userInfo[@"app_language"] = [NSBundle mxk_language] ? [NSBundle mxk_language] : userInfo[@"default_app_language"]; // The language chosen by the user
|
||||
|
||||
NSDate *currentDate = [NSDate date];
|
||||
NSDateFormatter *dateFormatter = [[NSDateFormatter alloc] init];
|
||||
[dateFormatter setDateFormat:@"yyyy-MM-dd HH:mm:ss"];
|
||||
userInfo[@"local_time"] = [dateFormatter stringFromDate:currentDate];
|
||||
|
||||
[dateFormatter setTimeZone:[NSTimeZone timeZoneWithName:@"UTC"]];
|
||||
userInfo[@"utc_time"] = [dateFormatter stringFromDate:currentDate];
|
||||
|
||||
bugReportRestClient.others = userInfo;
|
||||
|
||||
// Screenshot
|
||||
NSArray<NSURL*> *files;
|
||||
if (_screenshot && _sendScreenshot)
|
||||
{
|
||||
// Store the screenshot into a temporary file
|
||||
NSData *screenShotData = UIImagePNGRepresentation(_screenshot);
|
||||
screenShotFile = [NSURL fileURLWithPath:[NSTemporaryDirectory() stringByAppendingPathComponent:@"screenshot.png"]];
|
||||
[screenShotData writeToURL:screenShotFile atomically:YES];
|
||||
|
||||
files = @[screenShotFile];
|
||||
}
|
||||
|
||||
// Prepare labels to attach to the GitHub issue
|
||||
NSMutableArray<NSString*> *gitHubLabels = [NSMutableArray array];
|
||||
if (_reportCrash)
|
||||
{
|
||||
// Label the GH issue as "crash"
|
||||
[gitHubLabels addObject:@"crash"];
|
||||
}
|
||||
|
||||
// Add a Github label giving information about the version
|
||||
if (bugReportRestClient.version && bugReportRestClient.build)
|
||||
{
|
||||
NSString *build = bugReportRestClient.build;
|
||||
NSString *versionLabel = bugReportRestClient.version;
|
||||
|
||||
// If this is not the app store version, be more accurate on the build origin
|
||||
if ([build isEqualToString:NSLocalizedStringFromTable(@"settings_config_no_build_info", @"Vector", nil)])
|
||||
{
|
||||
// This is a debug session from Xcode
|
||||
versionLabel = [versionLabel stringByAppendingString:@"-debug"];
|
||||
}
|
||||
else if (build && ![build containsString:@"master"])
|
||||
{
|
||||
// This is a Jenkins build. Add the branch and the build number
|
||||
NSString *buildString = [build stringByReplacingOccurrencesOfString:@" " withString:@"-"];
|
||||
versionLabel = [[versionLabel stringByAppendingString:@"-"] stringByAppendingString:buildString];
|
||||
}
|
||||
|
||||
[gitHubLabels addObject:versionLabel];
|
||||
}
|
||||
|
||||
NSMutableString *bugReportDescription = [NSMutableString stringWithString:_bugReportDescriptionTextView.text];
|
||||
|
||||
if (_reportCrash)
|
||||
{
|
||||
// Append the crash dump to the user description in order to ease triaging of GH issues
|
||||
NSString *crashLogFile = [MXLogger crashLog];
|
||||
NSString *crashLog = [NSString stringWithContentsOfFile:crashLogFile encoding:NSUTF8StringEncoding error:nil];
|
||||
[bugReportDescription appendFormat:@"\n\n\n--------------------------------------------------------------------------------\n\n%@", crashLog];
|
||||
}
|
||||
|
||||
// Submit
|
||||
[bugReportRestClient sendBugReport:bugReportDescription sendLogs:_sendLogs sendCrashLog:_reportCrash sendFiles:files attachGitHubLabels:gitHubLabels progress:^(MXBugReportState state, NSProgress *progress) {
|
||||
|
||||
switch (state)
|
||||
{
|
||||
case MXBugReportStateProgressZipping:
|
||||
_sendingLabel.text = NSLocalizedStringFromTable(@"bug_report_progress_zipping", @"Vector", nil);
|
||||
break;
|
||||
|
||||
case MXBugReportStateProgressUploading:
|
||||
_sendingLabel.text = NSLocalizedStringFromTable(@"bug_report_progress_uploading", @"Vector", nil);
|
||||
break;
|
||||
|
||||
default:
|
||||
break;
|
||||
}
|
||||
|
||||
_sendingProgress.progress = progress.fractionCompleted;
|
||||
|
||||
} success:^{
|
||||
|
||||
bugReportRestClient = nil;
|
||||
|
||||
if (_reportCrash)
|
||||
{
|
||||
// Erase the crash log
|
||||
[MXLogger deleteCrashLog];
|
||||
}
|
||||
|
||||
[self dismissViewControllerAnimated:YES completion:nil];
|
||||
|
||||
} failure:^(NSError *error) {
|
||||
|
||||
bugReportRestClient = nil;
|
||||
|
||||
[[AppDelegate theDelegate] showErrorAsAlert:error];
|
||||
|
||||
_sendButton.hidden = NO;
|
||||
_sendingContainer.hidden = YES;
|
||||
}];
|
||||
}
|
||||
|
||||
- (IBAction)onCancelButtonPressed:(id)sender
|
||||
{
|
||||
if (bugReportRestClient)
|
||||
{
|
||||
// If the submission is in progress, cancel the sending and come back
|
||||
// to the bug report screen
|
||||
[bugReportRestClient cancel];
|
||||
bugReportRestClient = nil;
|
||||
|
||||
_sendButton.hidden = NO;
|
||||
_sendingContainer.hidden = YES;
|
||||
}
|
||||
else
|
||||
{
|
||||
if (_reportCrash)
|
||||
{
|
||||
// Erase the crash log
|
||||
[MXLogger deleteCrashLog];
|
||||
}
|
||||
|
||||
// Else, lease the bug report screen
|
||||
[self dismissViewControllerAnimated:YES completion:nil];
|
||||
}
|
||||
}
|
||||
|
||||
- (IBAction)onSendLogsTap:(id)sender
|
||||
{
|
||||
self.sendLogs = !self.sendLogs;
|
||||
}
|
||||
|
||||
- (IBAction)onSendScreenshotTap:(id)sender
|
||||
{
|
||||
self.sendScreenshot = !self.sendScreenshot;
|
||||
}
|
||||
|
||||
@end
|
||||
@@ -0,0 +1,256 @@
|
||||
<?xml version="1.0" encoding="UTF-8"?>
|
||||
<document type="com.apple.InterfaceBuilder3.CocoaTouch.XIB" version="3.0" toolsVersion="12121" systemVersion="16G29" targetRuntime="iOS.CocoaTouch" propertyAccessControl="none" useAutolayout="YES" useTraitCollections="YES" colorMatched="YES">
|
||||
<device id="retina5_5" orientation="portrait">
|
||||
<adaptation id="fullscreen"/>
|
||||
</device>
|
||||
<dependencies>
|
||||
<deployment identifier="iOS"/>
|
||||
<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" customClass="BugReportViewController">
|
||||
<connections>
|
||||
<outlet property="bugDescriptionContainer" destination="M04-Ch-cFF" id="E7E-0k-dhp"/>
|
||||
<outlet property="bugReportDescriptionTextView" destination="ssD-te-07G" id="r4D-TY-eeM"/>
|
||||
<outlet property="cancelButton" destination="GP9-vI-fCd" id="EAP-ww-j9T"/>
|
||||
<outlet property="containerView" destination="7U4-br-xRl" id="kJI-mL-pkw"/>
|
||||
<outlet property="descriptionLabel" destination="Q2l-Yi-SlQ" id="VPO-0N-huQ"/>
|
||||
<outlet property="logsDescriptionLabel" destination="ggt-kq-Zy9" id="3Nl-m3-1EE"/>
|
||||
<outlet property="overlayView" destination="CXZ-fI-kPd" id="ZJb-0n-Tmf"/>
|
||||
<outlet property="scrollView" destination="4fS-3N-tbW" id="Dsn-gw-VuW"/>
|
||||
<outlet property="scrollViewBottomConstraint" destination="fnt-1e-ZW4" id="W1B-1m-h13"/>
|
||||
<outlet property="sendButton" destination="z8A-7B-jAi" id="VSX-a9-yfs"/>
|
||||
<outlet property="sendLogsButtonImage" destination="hcc-ve-8OC" id="GcJ-Dq-6pz"/>
|
||||
<outlet property="sendLogsContainer" destination="OVa-m0-Ygk" id="Il5-fW-fKU"/>
|
||||
<outlet property="sendLogsLabel" destination="ZcH-7V-sfZ" id="NMr-wH-57G"/>
|
||||
<outlet property="sendScreenshotButtonImage" destination="wmW-9T-6xp" id="Ilg-F0-ZlY"/>
|
||||
<outlet property="sendScreenshotContainer" destination="6VA-Ng-S8R" id="nev-73-rpf"/>
|
||||
<outlet property="sendScreenshotContainerHeightConstraint" destination="VeX-9J-Jqe" id="dSo-Tz-5Lr"/>
|
||||
<outlet property="sendScreenshotLabel" destination="jnv-xY-Byx" id="cmX-GO-kf2"/>
|
||||
<outlet property="sendingContainer" destination="LNe-Lp-3ex" id="jFi-Yr-1JW"/>
|
||||
<outlet property="sendingLabel" destination="yBc-B9-RaA" id="KOf-7Z-uMa"/>
|
||||
<outlet property="sendingProgress" destination="cEm-mn-WCS" id="pPB-4u-ojG"/>
|
||||
<outlet property="titleLabel" destination="wQK-Os-GcK" id="s44-wX-t60"/>
|
||||
<outlet property="view" destination="i5M-Pr-FkT" id="sfx-zR-JGt"/>
|
||||
</connections>
|
||||
</placeholder>
|
||||
<placeholder placeholderIdentifier="IBFirstResponder" id="-2" customClass="UIResponder"/>
|
||||
<view clearsContextBeforeDrawing="NO" contentMode="scaleToFill" id="i5M-Pr-FkT">
|
||||
<rect key="frame" x="0.0" y="0.0" width="414" height="736"/>
|
||||
<autoresizingMask key="autoresizingMask" widthSizable="YES" heightSizable="YES"/>
|
||||
<subviews>
|
||||
<view alpha="0.5" contentMode="scaleToFill" translatesAutoresizingMaskIntoConstraints="NO" id="CXZ-fI-kPd">
|
||||
<rect key="frame" x="0.0" y="0.0" width="414" height="736"/>
|
||||
<color key="backgroundColor" white="0.66666666666666663" alpha="1" colorSpace="calibratedWhite"/>
|
||||
</view>
|
||||
<scrollView clipsSubviews="YES" multipleTouchEnabled="YES" contentMode="scaleToFill" alwaysBounceVertical="YES" keyboardDismissMode="interactive" translatesAutoresizingMaskIntoConstraints="NO" id="4fS-3N-tbW">
|
||||
<rect key="frame" x="0.0" y="0.0" width="414" height="736"/>
|
||||
<subviews>
|
||||
<view contentMode="scaleToFill" translatesAutoresizingMaskIntoConstraints="NO" id="6kv-1a-Lhr">
|
||||
<rect key="frame" x="0.0" y="0.0" width="414" height="736"/>
|
||||
<subviews>
|
||||
<view contentMode="scaleToFill" translatesAutoresizingMaskIntoConstraints="NO" id="7U4-br-xRl">
|
||||
<rect key="frame" x="10" y="148" width="394" height="440"/>
|
||||
<subviews>
|
||||
<button opaque="NO" contentMode="scaleToFill" contentHorizontalAlignment="center" contentVerticalAlignment="center" buttonType="roundedRect" lineBreakMode="middleTruncation" translatesAutoresizingMaskIntoConstraints="NO" id="z8A-7B-jAi">
|
||||
<rect key="frame" x="338" y="390" width="36" height="30"/>
|
||||
<state key="normal" title="Send"/>
|
||||
<connections>
|
||||
<action selector="onSendButtonPress:" destination="-1" eventType="touchUpInside" id="nL7-1U-dd6"/>
|
||||
</connections>
|
||||
</button>
|
||||
<button opaque="NO" contentMode="scaleToFill" contentHorizontalAlignment="center" contentVerticalAlignment="center" buttonType="roundedRect" lineBreakMode="middleTruncation" translatesAutoresizingMaskIntoConstraints="NO" id="GP9-vI-fCd">
|
||||
<rect key="frame" x="20" y="390" width="48" height="30"/>
|
||||
<state key="normal" title="Cancel"/>
|
||||
<connections>
|
||||
<action selector="onCancelButtonPressed:" destination="-1" eventType="touchUpInside" id="97W-bS-g6F"/>
|
||||
</connections>
|
||||
</button>
|
||||
<label opaque="NO" userInteractionEnabled="NO" contentMode="left" horizontalHuggingPriority="251" verticalHuggingPriority="251" text="Bug Report" textAlignment="center" lineBreakMode="tailTruncation" baselineAdjustment="alignBaselines" adjustsFontSizeToFit="NO" translatesAutoresizingMaskIntoConstraints="NO" id="wQK-Os-GcK">
|
||||
<rect key="frame" x="152" y="20" width="91" height="21"/>
|
||||
<color key="backgroundColor" white="0.0" alpha="0.0" colorSpace="calibratedWhite"/>
|
||||
<fontDescription key="fontDescription" type="system" weight="semibold" pointSize="17"/>
|
||||
<nil key="textColor"/>
|
||||
<nil key="highlightedColor"/>
|
||||
</label>
|
||||
<view contentMode="scaleToFill" translatesAutoresizingMaskIntoConstraints="NO" id="M04-Ch-cFF">
|
||||
<rect key="frame" x="0.0" y="48.666666666666657" width="394" height="333"/>
|
||||
<subviews>
|
||||
<label opaque="NO" userInteractionEnabled="NO" contentMode="left" horizontalHuggingPriority="251" verticalHuggingPriority="251" text="pop up explanation" textAlignment="natural" lineBreakMode="tailTruncation" numberOfLines="0" baselineAdjustment="alignBaselines" adjustsFontSizeToFit="NO" translatesAutoresizingMaskIntoConstraints="NO" id="Q2l-Yi-SlQ">
|
||||
<rect key="frame" x="20" y="0.0" width="354" height="16"/>
|
||||
<fontDescription key="fontDescription" type="system" pointSize="13"/>
|
||||
<nil key="textColor"/>
|
||||
<nil key="highlightedColor"/>
|
||||
</label>
|
||||
<textView clipsSubviews="YES" multipleTouchEnabled="YES" contentMode="scaleToFill" showsHorizontalScrollIndicator="NO" keyboardDismissMode="onDrag" text="bug description" textAlignment="natural" translatesAutoresizingMaskIntoConstraints="NO" id="ssD-te-07G">
|
||||
<rect key="frame" x="20" y="23.999999999999986" width="354" height="221"/>
|
||||
<color key="backgroundColor" white="0.0" alpha="0.0" colorSpace="calibratedWhite"/>
|
||||
<fontDescription key="fontDescription" type="system" pointSize="13"/>
|
||||
<textInputTraits key="textInputTraits" autocapitalizationType="sentences"/>
|
||||
</textView>
|
||||
<label opaque="NO" userInteractionEnabled="NO" contentMode="left" horizontalHuggingPriority="251" verticalHuggingPriority="251" text="log bla bla" textAlignment="natural" lineBreakMode="tailTruncation" numberOfLines="0" baselineAdjustment="alignBaselines" adjustsFontSizeToFit="NO" translatesAutoresizingMaskIntoConstraints="NO" id="ggt-kq-Zy9">
|
||||
<rect key="frame" x="20" y="253" width="354" height="16"/>
|
||||
<fontDescription key="fontDescription" type="system" pointSize="13"/>
|
||||
<nil key="textColor"/>
|
||||
<nil key="highlightedColor"/>
|
||||
</label>
|
||||
<view contentMode="scaleToFill" translatesAutoresizingMaskIntoConstraints="NO" id="OVa-m0-Ygk">
|
||||
<rect key="frame" x="20" y="277" width="354" height="24"/>
|
||||
<subviews>
|
||||
<label opaque="NO" userInteractionEnabled="NO" contentMode="left" horizontalHuggingPriority="251" verticalHuggingPriority="251" text="Send logs" textAlignment="natural" lineBreakMode="tailTruncation" baselineAdjustment="alignBaselines" adjustsFontSizeToFit="NO" translatesAutoresizingMaskIntoConstraints="NO" id="ZcH-7V-sfZ">
|
||||
<rect key="frame" x="50" y="4" width="284" height="16"/>
|
||||
<color key="backgroundColor" white="0.0" alpha="0.0" colorSpace="calibratedWhite"/>
|
||||
<fontDescription key="fontDescription" type="system" pointSize="13"/>
|
||||
<nil key="textColor"/>
|
||||
<nil key="highlightedColor"/>
|
||||
</label>
|
||||
<imageView userInteractionEnabled="NO" contentMode="scaleToFill" horizontalHuggingPriority="252" verticalHuggingPriority="251" image="selection_tick.png" translatesAutoresizingMaskIntoConstraints="NO" id="hcc-ve-8OC">
|
||||
<rect key="frame" x="20" y="1" width="22" height="22"/>
|
||||
<color key="backgroundColor" white="0.0" alpha="0.0" colorSpace="calibratedWhite"/>
|
||||
</imageView>
|
||||
</subviews>
|
||||
<color key="backgroundColor" white="0.0" alpha="0.0" colorSpace="calibratedWhite"/>
|
||||
<constraints>
|
||||
<constraint firstAttribute="trailing" secondItem="ZcH-7V-sfZ" secondAttribute="trailing" constant="20" symbolic="YES" id="9Iy-Ok-Cjg"/>
|
||||
<constraint firstAttribute="height" constant="24" id="Mx1-6V-BcR"/>
|
||||
<constraint firstItem="ZcH-7V-sfZ" firstAttribute="leading" secondItem="hcc-ve-8OC" secondAttribute="trailing" constant="8" symbolic="YES" id="bGG-0o-MaX"/>
|
||||
<constraint firstItem="hcc-ve-8OC" firstAttribute="leading" secondItem="OVa-m0-Ygk" secondAttribute="leading" constant="20" symbolic="YES" id="fHn-8y-bug"/>
|
||||
<constraint firstItem="hcc-ve-8OC" firstAttribute="centerY" secondItem="OVa-m0-Ygk" secondAttribute="centerY" id="g8W-mO-cqm"/>
|
||||
<constraint firstItem="ZcH-7V-sfZ" firstAttribute="centerY" secondItem="OVa-m0-Ygk" secondAttribute="centerY" id="uxN-4G-PYv"/>
|
||||
</constraints>
|
||||
</view>
|
||||
<view contentMode="scaleToFill" translatesAutoresizingMaskIntoConstraints="NO" id="6VA-Ng-S8R">
|
||||
<rect key="frame" x="20" y="309" width="354" height="23.999999999999943"/>
|
||||
<subviews>
|
||||
<label opaque="NO" userInteractionEnabled="NO" contentMode="left" horizontalHuggingPriority="251" verticalHuggingPriority="251" text="Send screenshot" textAlignment="natural" lineBreakMode="tailTruncation" baselineAdjustment="alignBaselines" adjustsFontSizeToFit="NO" translatesAutoresizingMaskIntoConstraints="NO" id="jnv-xY-Byx">
|
||||
<rect key="frame" x="50" y="4" width="284" height="15.999999999999943"/>
|
||||
<color key="backgroundColor" white="0.0" alpha="0.0" colorSpace="calibratedWhite"/>
|
||||
<fontDescription key="fontDescription" type="system" pointSize="13"/>
|
||||
<nil key="textColor"/>
|
||||
<nil key="highlightedColor"/>
|
||||
</label>
|
||||
<imageView userInteractionEnabled="NO" contentMode="scaleToFill" horizontalHuggingPriority="252" verticalHuggingPriority="251" image="selection_tick.png" translatesAutoresizingMaskIntoConstraints="NO" id="wmW-9T-6xp">
|
||||
<rect key="frame" x="20" y="1" width="22" height="21.999999999999943"/>
|
||||
<color key="backgroundColor" white="0.0" alpha="0.0" colorSpace="calibratedWhite"/>
|
||||
</imageView>
|
||||
</subviews>
|
||||
<color key="backgroundColor" white="0.0" alpha="0.0" colorSpace="calibratedWhite"/>
|
||||
<constraints>
|
||||
<constraint firstItem="wmW-9T-6xp" firstAttribute="centerY" secondItem="6VA-Ng-S8R" secondAttribute="centerY" id="32U-Zz-sOj"/>
|
||||
<constraint firstAttribute="trailing" secondItem="jnv-xY-Byx" secondAttribute="trailing" constant="20" symbolic="YES" id="BZv-q9-LI1"/>
|
||||
<constraint firstItem="jnv-xY-Byx" firstAttribute="leading" secondItem="wmW-9T-6xp" secondAttribute="trailing" constant="8" symbolic="YES" id="Hqs-Rg-51S"/>
|
||||
<constraint firstItem="wmW-9T-6xp" firstAttribute="leading" secondItem="6VA-Ng-S8R" secondAttribute="leading" constant="20" symbolic="YES" id="QdL-vu-bwn"/>
|
||||
<constraint firstAttribute="height" constant="24" id="VeX-9J-Jqe"/>
|
||||
<constraint firstItem="jnv-xY-Byx" firstAttribute="centerY" secondItem="6VA-Ng-S8R" secondAttribute="centerY" id="wjW-aR-qEa"/>
|
||||
</constraints>
|
||||
</view>
|
||||
</subviews>
|
||||
<color key="backgroundColor" white="0.0" alpha="0.0" colorSpace="calibratedWhite"/>
|
||||
<constraints>
|
||||
<constraint firstItem="ggt-kq-Zy9" firstAttribute="top" secondItem="ssD-te-07G" secondAttribute="bottom" constant="8" symbolic="YES" id="0YT-Fs-UO8"/>
|
||||
<constraint firstItem="OVa-m0-Ygk" firstAttribute="top" secondItem="ggt-kq-Zy9" secondAttribute="bottom" constant="8" symbolic="YES" id="DQQ-QT-2H6"/>
|
||||
<constraint firstItem="OVa-m0-Ygk" firstAttribute="leading" secondItem="M04-Ch-cFF" secondAttribute="leading" constant="20" symbolic="YES" id="HK2-UZ-X2p"/>
|
||||
<constraint firstAttribute="bottom" secondItem="6VA-Ng-S8R" secondAttribute="bottom" id="OxY-0X-OjC"/>
|
||||
<constraint firstAttribute="trailing" secondItem="ssD-te-07G" secondAttribute="trailing" constant="20" symbolic="YES" id="PiB-wd-sXN"/>
|
||||
<constraint firstAttribute="trailing" secondItem="Q2l-Yi-SlQ" secondAttribute="trailing" constant="20" symbolic="YES" id="PrN-VH-DSf"/>
|
||||
<constraint firstItem="6VA-Ng-S8R" firstAttribute="top" secondItem="OVa-m0-Ygk" secondAttribute="bottom" constant="8" symbolic="YES" id="VN5-7V-cxF"/>
|
||||
<constraint firstItem="Q2l-Yi-SlQ" firstAttribute="leading" secondItem="M04-Ch-cFF" secondAttribute="leading" constant="20" symbolic="YES" id="ZGX-fc-3iQ"/>
|
||||
<constraint firstItem="6VA-Ng-S8R" firstAttribute="leading" secondItem="M04-Ch-cFF" secondAttribute="leading" constant="20" symbolic="YES" id="fn7-mZ-k9U"/>
|
||||
<constraint firstAttribute="trailing" secondItem="6VA-Ng-S8R" secondAttribute="trailing" constant="20" symbolic="YES" id="gHk-8h-Igd"/>
|
||||
<constraint firstItem="ssD-te-07G" firstAttribute="top" secondItem="Q2l-Yi-SlQ" secondAttribute="bottom" constant="8" symbolic="YES" id="n7A-MF-Yx7"/>
|
||||
<constraint firstItem="Q2l-Yi-SlQ" firstAttribute="top" secondItem="M04-Ch-cFF" secondAttribute="top" id="p1A-KV-QoY"/>
|
||||
<constraint firstItem="ggt-kq-Zy9" firstAttribute="leading" secondItem="M04-Ch-cFF" secondAttribute="leading" constant="20" symbolic="YES" id="rXd-D8-ltW"/>
|
||||
<constraint firstItem="ssD-te-07G" firstAttribute="leading" secondItem="M04-Ch-cFF" secondAttribute="leading" constant="20" symbolic="YES" id="uVU-j1-jOR"/>
|
||||
<constraint firstAttribute="trailing" secondItem="ggt-kq-Zy9" secondAttribute="trailing" constant="20" symbolic="YES" id="v0T-xl-zxs"/>
|
||||
<constraint firstAttribute="trailing" secondItem="OVa-m0-Ygk" secondAttribute="trailing" constant="20" symbolic="YES" id="wU2-Mr-BtI"/>
|
||||
</constraints>
|
||||
</view>
|
||||
<view hidden="YES" contentMode="scaleToFill" translatesAutoresizingMaskIntoConstraints="NO" id="LNe-Lp-3ex">
|
||||
<rect key="frame" x="0.0" y="49" width="394" height="333"/>
|
||||
<subviews>
|
||||
<label opaque="NO" userInteractionEnabled="NO" contentMode="left" horizontalHuggingPriority="251" verticalHuggingPriority="251" text="Uploading report" textAlignment="natural" lineBreakMode="tailTruncation" numberOfLines="0" baselineAdjustment="alignBaselines" adjustsFontSizeToFit="NO" translatesAutoresizingMaskIntoConstraints="NO" id="yBc-B9-RaA">
|
||||
<rect key="frame" x="131.66666666666669" y="135.66666666666669" width="130.00000000000006" height="21"/>
|
||||
<color key="backgroundColor" white="0.0" alpha="0.0" colorSpace="calibratedWhite"/>
|
||||
<fontDescription key="fontDescription" type="system" pointSize="17"/>
|
||||
<nil key="textColor"/>
|
||||
<nil key="highlightedColor"/>
|
||||
</label>
|
||||
<progressView opaque="NO" contentMode="scaleToFill" verticalHuggingPriority="750" progress="0.5" translatesAutoresizingMaskIntoConstraints="NO" id="cEm-mn-WCS">
|
||||
<rect key="frame" x="20" y="165" width="354" height="2"/>
|
||||
</progressView>
|
||||
</subviews>
|
||||
<color key="backgroundColor" white="1" alpha="1" colorSpace="calibratedWhite"/>
|
||||
<constraints>
|
||||
<constraint firstItem="cEm-mn-WCS" firstAttribute="leading" secondItem="LNe-Lp-3ex" secondAttribute="leading" constant="20" symbolic="YES" id="7W7-nx-pqf"/>
|
||||
<constraint firstItem="cEm-mn-WCS" firstAttribute="centerY" secondItem="LNe-Lp-3ex" secondAttribute="centerY" id="oXf-Hd-ZDM"/>
|
||||
<constraint firstItem="yBc-B9-RaA" firstAttribute="centerX" secondItem="LNe-Lp-3ex" secondAttribute="centerX" id="pBP-7l-ALI"/>
|
||||
<constraint firstAttribute="trailing" secondItem="cEm-mn-WCS" secondAttribute="trailing" constant="20" symbolic="YES" id="ujU-Pg-spz"/>
|
||||
<constraint firstItem="cEm-mn-WCS" firstAttribute="top" secondItem="yBc-B9-RaA" secondAttribute="bottom" constant="8" symbolic="YES" id="yW9-nd-MOV"/>
|
||||
</constraints>
|
||||
</view>
|
||||
</subviews>
|
||||
<color key="backgroundColor" white="1" alpha="1" colorSpace="calibratedWhite"/>
|
||||
<constraints>
|
||||
<constraint firstAttribute="trailing" secondItem="M04-Ch-cFF" secondAttribute="trailing" id="44e-Ev-6yY"/>
|
||||
<constraint firstItem="M04-Ch-cFF" firstAttribute="top" secondItem="wQK-Os-GcK" secondAttribute="bottom" constant="8" symbolic="YES" id="9XY-Ey-3ha"/>
|
||||
<constraint firstItem="M04-Ch-cFF" firstAttribute="leading" secondItem="7U4-br-xRl" secondAttribute="leading" id="BM2-hk-Kaf"/>
|
||||
<constraint firstItem="GP9-vI-fCd" firstAttribute="leading" secondItem="7U4-br-xRl" secondAttribute="leading" constant="20" symbolic="YES" id="Gob-us-GZi"/>
|
||||
<constraint firstItem="GP9-vI-fCd" firstAttribute="top" secondItem="LNe-Lp-3ex" secondAttribute="bottom" constant="8" symbolic="YES" id="I2l-Tu-vhZ"/>
|
||||
<constraint firstAttribute="height" relation="lessThanOrEqual" constant="440" id="JJv-yi-CzO"/>
|
||||
<constraint firstAttribute="bottom" secondItem="GP9-vI-fCd" secondAttribute="bottom" constant="20" symbolic="YES" id="KLD-Ci-d3w"/>
|
||||
<constraint firstItem="wQK-Os-GcK" firstAttribute="top" secondItem="7U4-br-xRl" secondAttribute="top" constant="20" symbolic="YES" id="NWD-tl-Klm"/>
|
||||
<constraint firstItem="LNe-Lp-3ex" firstAttribute="top" secondItem="wQK-Os-GcK" secondAttribute="bottom" constant="8" symbolic="YES" id="RDy-f3-TJi"/>
|
||||
<constraint firstItem="wQK-Os-GcK" firstAttribute="centerX" secondItem="7U4-br-xRl" secondAttribute="centerX" id="RVC-sI-Oz5"/>
|
||||
<constraint firstAttribute="trailing" secondItem="z8A-7B-jAi" secondAttribute="trailing" constant="20" symbolic="YES" id="b4D-p2-P7o"/>
|
||||
<constraint firstAttribute="bottom" secondItem="z8A-7B-jAi" secondAttribute="bottom" constant="20" symbolic="YES" id="if6-hX-aXW"/>
|
||||
<constraint firstItem="LNe-Lp-3ex" firstAttribute="leading" secondItem="7U4-br-xRl" secondAttribute="leading" id="lIi-WR-VWe"/>
|
||||
<constraint firstItem="GP9-vI-fCd" firstAttribute="top" secondItem="M04-Ch-cFF" secondAttribute="bottom" constant="8" symbolic="YES" id="m9A-OZ-fPW"/>
|
||||
<constraint firstAttribute="width" relation="lessThanOrEqual" constant="548" id="t04-vt-fgG"/>
|
||||
<constraint firstAttribute="trailing" secondItem="LNe-Lp-3ex" secondAttribute="trailing" id="wnx-n7-rgw"/>
|
||||
</constraints>
|
||||
</view>
|
||||
</subviews>
|
||||
<color key="backgroundColor" white="0.0" alpha="0.0" colorSpace="calibratedWhite"/>
|
||||
<constraints>
|
||||
<constraint firstItem="7U4-br-xRl" firstAttribute="leading" relation="greaterThanOrEqual" secondItem="6kv-1a-Lhr" secondAttribute="leading" constant="10" id="CSO-wP-pdr"/>
|
||||
<constraint firstAttribute="bottom" relation="greaterThanOrEqual" secondItem="7U4-br-xRl" secondAttribute="bottom" constant="10" id="F2i-d1-9S3"/>
|
||||
<constraint firstAttribute="trailing" relation="greaterThanOrEqual" secondItem="7U4-br-xRl" secondAttribute="trailing" constant="10" id="Nbx-Ao-7SO"/>
|
||||
<constraint firstItem="7U4-br-xRl" firstAttribute="centerY" secondItem="6kv-1a-Lhr" secondAttribute="centerY" id="PvY-ey-thJ"/>
|
||||
<constraint firstItem="7U4-br-xRl" firstAttribute="top" relation="greaterThanOrEqual" secondItem="6kv-1a-Lhr" secondAttribute="top" constant="10" id="XOJ-mW-3qA"/>
|
||||
<constraint firstAttribute="trailing" secondItem="7U4-br-xRl" secondAttribute="trailing" priority="750" constant="10" id="kSK-PP-bzw"/>
|
||||
<constraint firstItem="7U4-br-xRl" firstAttribute="top" secondItem="6kv-1a-Lhr" secondAttribute="top" priority="750" constant="10" id="mno-KA-jie"/>
|
||||
<constraint firstItem="7U4-br-xRl" firstAttribute="centerX" secondItem="6kv-1a-Lhr" secondAttribute="centerX" id="oDy-c8-jnF"/>
|
||||
<constraint firstAttribute="bottom" secondItem="7U4-br-xRl" secondAttribute="bottom" priority="750" constant="10" id="x84-eL-xQ1"/>
|
||||
<constraint firstItem="7U4-br-xRl" firstAttribute="leading" secondItem="6kv-1a-Lhr" secondAttribute="leading" priority="750" constant="10" id="xGR-ug-r2Q"/>
|
||||
</constraints>
|
||||
</view>
|
||||
</subviews>
|
||||
<color key="backgroundColor" white="0.0" alpha="0.0" colorSpace="calibratedWhite"/>
|
||||
<constraints>
|
||||
<constraint firstAttribute="trailing" secondItem="6kv-1a-Lhr" secondAttribute="trailing" id="7vB-j2-C03"/>
|
||||
<constraint firstItem="6kv-1a-Lhr" firstAttribute="top" secondItem="4fS-3N-tbW" secondAttribute="top" id="8M7-U4-6fJ"/>
|
||||
<constraint firstItem="6kv-1a-Lhr" firstAttribute="leading" secondItem="4fS-3N-tbW" secondAttribute="leading" id="DAc-g2-i6o"/>
|
||||
<constraint firstItem="6kv-1a-Lhr" firstAttribute="centerX" secondItem="4fS-3N-tbW" secondAttribute="centerX" id="LUz-Bn-4ud"/>
|
||||
<constraint firstAttribute="bottom" secondItem="6kv-1a-Lhr" secondAttribute="bottom" id="aJK-JH-KKg"/>
|
||||
<constraint firstItem="6kv-1a-Lhr" firstAttribute="centerY" secondItem="4fS-3N-tbW" secondAttribute="centerY" id="igl-zZ-dGQ"/>
|
||||
</constraints>
|
||||
</scrollView>
|
||||
</subviews>
|
||||
<color key="backgroundColor" white="0.0" alpha="0.0" colorSpace="calibratedWhite"/>
|
||||
<constraints>
|
||||
<constraint firstAttribute="bottom" secondItem="CXZ-fI-kPd" secondAttribute="bottom" id="CGb-38-bKL"/>
|
||||
<constraint firstItem="4fS-3N-tbW" firstAttribute="leading" secondItem="i5M-Pr-FkT" secondAttribute="leading" id="YGg-YG-HLZ"/>
|
||||
<constraint firstItem="CXZ-fI-kPd" firstAttribute="top" secondItem="i5M-Pr-FkT" secondAttribute="top" id="bb7-tN-Ddn"/>
|
||||
<constraint firstAttribute="bottom" secondItem="4fS-3N-tbW" secondAttribute="bottom" id="fnt-1e-ZW4"/>
|
||||
<constraint firstAttribute="trailing" secondItem="4fS-3N-tbW" secondAttribute="trailing" id="hu9-zv-wuB"/>
|
||||
<constraint firstItem="CXZ-fI-kPd" firstAttribute="leading" secondItem="i5M-Pr-FkT" secondAttribute="leading" id="iUc-fm-Ppk"/>
|
||||
<constraint firstItem="4fS-3N-tbW" firstAttribute="top" secondItem="i5M-Pr-FkT" secondAttribute="top" id="nn7-gx-g9q"/>
|
||||
<constraint firstAttribute="trailing" secondItem="CXZ-fI-kPd" secondAttribute="trailing" id="yzo-vl-3Ep"/>
|
||||
</constraints>
|
||||
</view>
|
||||
</objects>
|
||||
<resources>
|
||||
<image name="selection_tick.png" width="22" height="22"/>
|
||||
</resources>
|
||||
</document>
|
||||
Reference in New Issue
Block a user