| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174 |
- // Copyright 2020 Google LLC
- //
- // 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.
- // Non-google3 relative import to support building with Xcode.
- #import "NetworkRequestsViewController.h"
- #import "../Networking/NetworkConnectionsFactory.h"
- #import "NetworkConnectionViewController.h"
- static NSString *const kConnectionsConfigurationFileName = @"network_connections";
- static const CGFloat kNetworkConnectionViewHeight = 70.f;
- static const CGFloat kConnectionsListTopOffset = 30.f;
- @interface NetworkRequestsViewController ()
- @property(nonatomic, strong) NSMutableArray<UIViewController *> *connectionControllers;
- @property(nonatomic, weak) UIScrollView *scrollView;
- @property(nonatomic, strong) NSDictionary<NSString *, id<NetworkConnection>> *titleConnectionPairs;
- @end
- @implementation NetworkRequestsViewController
- - (instancetype)initWithNibName:(NSString *)nibNameOrNil bundle:(NSBundle *)nibBundleOrNil {
- self = [super initWithNibName:nibNameOrNil bundle:nibBundleOrNil];
- if (self) {
- self.titleConnectionPairs = [NetworkConnectionsFactory
- titleConnectionPairsFromConfigFile:kConnectionsConfigurationFileName];
- self.connectionControllers = [[NSMutableArray alloc] init];
- }
- return self;
- }
- #pragma mark - View Life Cycle
- - (void)loadView {
- UIView *view = [[UIView alloc] initWithFrame:[[UIScreen mainScreen] bounds]];
- view.backgroundColor = [UIColor whiteColor];
- self.view = view;
- [self createViewTree];
- [self constrainViews];
- }
- #pragma mark - Private methods
- - (CGSize)scrollContentViewSize {
- return CGSizeMake(
- [UIScreen mainScreen].bounds.size.width,
- self.titleConnectionPairs.count * kNetworkConnectionViewHeight + kConnectionsListTopOffset);
- }
- - (void)createViewTree {
- UIScrollView *scrollView = [[UIScrollView alloc] init];
- scrollView.translatesAutoresizingMaskIntoConstraints = NO;
- CGSize contentViewSize = [self scrollContentViewSize];
- UIView *contentView = [[UIView alloc]
- initWithFrame:CGRectMake(0., 0., contentViewSize.width, contentViewSize.height)];
- [self.view addSubview:scrollView];
- self.scrollView = scrollView;
- scrollView.scrollEnabled = YES;
- scrollView.contentSize = contentViewSize;
- scrollView.accessibilityIdentifier = @"RequestsScrollView";
- [self.titleConnectionPairs enumerateKeysAndObjectsUsingBlock:^(
- NSString *_Nonnull title,
- id<NetworkConnection> _Nonnull connection, BOOL *_Nonnull stop) {
- NetworkConnectionViewController *connectionController =
- [[NetworkConnectionViewController alloc] initWithNetworkConnection:connection title:title];
- [self.connectionControllers addObject:connectionController];
- [contentView addSubview:connectionController.view];
- }];
- [scrollView addSubview:contentView];
- }
- - (void)constraintScrollView {
- NSArray *horizontalConstraints =
- [NSLayoutConstraint constraintsWithVisualFormat:@"|-0-[_scrollView]-0-|"
- options:0
- metrics:nil
- views:NSDictionaryOfVariableBindings(_scrollView)];
- [self.view addConstraints:horizontalConstraints];
- NSArray *verticalConstraints =
- [NSLayoutConstraint constraintsWithVisualFormat:@"V:|-0-[_scrollView]"
- options:0
- metrics:nil
- views:NSDictionaryOfVariableBindings(_scrollView)];
- [self.view addConstraints:verticalConstraints];
- [self.view addConstraint:[NSLayoutConstraint constraintWithItem:_scrollView
- attribute:NSLayoutAttributeBottom
- relatedBy:NSLayoutRelationEqual
- toItem:self.bottomLayoutGuide
- attribute:NSLayoutAttributeTop
- multiplier:1.0
- constant:0.0]];
- }
- - (void)constrainViews {
- [self constraintScrollView];
- __block UIView *previousView = nil;
- [self.connectionControllers enumerateObjectsUsingBlock:^(
- UIViewController *_Nonnull connectionController, NSUInteger idx,
- BOOL *_Nonnull stop) {
- UIView *connectionView = connectionController.view;
- connectionView.translatesAutoresizingMaskIntoConstraints = NO;
- [self.scrollView addConstraints:[self horizontalConstraintsForConnectionView:connectionView]];
- [self.scrollView addConstraints:[self verticalConstraintsForConnectionView:connectionView
- previousViewIfExists:previousView]];
- previousView = connectionView;
- }];
- }
- - (NSArray *)horizontalConstraintsForConnectionView:(UIView *)connectionView {
- return [NSLayoutConstraint
- constraintsWithVisualFormat:@"|-0-[connectionView]-0-|"
- options:0
- metrics:nil
- views:NSDictionaryOfVariableBindings(connectionView)];
- }
- - (NSArray *)verticalConstraintsForConnectionView:(UIView *)connectionView
- previousViewIfExists:(UIView *)previousView {
- NSArray *constraints = nil;
- NSDictionary *metrics = @{
- @"viewHeight" : @(kNetworkConnectionViewHeight),
- @"topOffset" : @(kConnectionsListTopOffset)
- };
- NSString *visualFormat = nil;
- if (previousView) {
- NSDictionary *viewsBindings = NSDictionaryOfVariableBindings(connectionView, previousView);
- visualFormat = @"V:[previousView]-0-[connectionView(viewHeight)]";
- constraints = [NSLayoutConstraint constraintsWithVisualFormat:visualFormat
- options:0
- metrics:metrics
- views:viewsBindings];
- } else {
- NSDictionary *viewsBindings = NSDictionaryOfVariableBindings(connectionView);
- visualFormat = @"V:|-(topOffset)-[connectionView(viewHeight)]";
- constraints = [NSLayoutConstraint constraintsWithVisualFormat:visualFormat
- options:0
- metrics:metrics
- views:viewsBindings];
- }
- return constraints;
- }
- @end
|