2016-07-27 3 views
0

В контроллере представления отображаются два UIViews вверх и вниз. Они имеют одинаковую ширину и 20 пикселей друг от друга.Невозможно изменить размеры подзонов в определенном UIView

Если я нажму UIButton, высота верхнего вида (viewUpper) должна увеличиться на 30 пикселей; а нижняя (viewLower) уменьшается на ту же сумму. До сих пор я делал взгляды так, как хочу. Верхний расширился, а нижний сократился.

Кроме того, координата y viewLower также увеличивается на такую ​​же величину, чтобы эти два вида сохраняли расстояние.

Проблема заключается в том, что подсмотры в нижнем представлении не меняются так же, как и надстройка. Нижний вид имеет два подвидности, выровненных вверх и вниз.

Верхний подзаголовок (viewTitle) должен сохранять свой размер. Нижний subview (viewContent) должен уменьшаться на 30 пикселей. Я написал код следующего кода:

viewContent.frame.size.height -= 30 

Этот, однако, не работал. Поэтому я использовал для заявления, написанного ниже, что не сработало.

enter image description here

@IBAction func changeSize(sender: UIButton) { 
    //d is a Bool variable to choose whether it's turn to shrink the viewLower or not 
    if d{ 
     d = false 

     viewUpper.frame.size.height += 30 
     viewLower.frame.size.height -= 30 
     viewLower.frame.origin.y += 30 

     //do not work 
     //viewContetnt.frame.size.height -= 30 

     //I tried this code to change the subviews in the same way 
     for views in viewLower.subviews { 
      if views.frame.size.height > 30 { 
       views.frame.size.height -= 30 
      } 
     } 
    } 
    else { 
     d = true 

     viewUpper.frame.size.height -= 30 
     viewLower.frame.size.height += 30 
     viewLower.frame.origin.y -= 30 

     //do not work 
     //viewContetnt.frame.size.height += 30 

     //I tried this code to change the subviews in the same way 
     for views in viewLower.subviews { 
      if views.frame.size.height > 30 { 
       views.frame.size.height += 30 
      } 
     } 
    } 
} 

func changeWholeViewSize(view: UIView, f: CGFloat){ 
    for views in view.subviews { 

     if view.frame.size.height > 40 { 
      views.frame.size.height -= f 
     } 
     if(views.subviews.count > 0) { 
      changeWholeViewSize(views, f: f) 
     } 
    } 
} 

Как мне справиться с этой проблемой? Единственные два пути, которые я знаю, не помогают мне.

+0

Фактически viewContent имеет два UITableViews; Я не упоминал их –

+0

Вы добавили представления и задали фреймы или использовали ограничения? – Wain

+0

@Wain Я установил ограничения для каждого вида для установки макетов. Но ни один из них не фиксирует размеры просмотров; только, сколько пикселей они являются друг от друга. –

ответ

0

Из того, что я понимаю, попробуйте следующее: (с использованием ограничений)

1) Установить верхнюю, ведущий, отставая и высота препятствий для viewUpper.

enter image description here

2) Установить ведущий, в конце, нижние ограничения для viewLower.

3) Установить вертикальное расстояние между двумя точками зрения, то есть, 20.

enter image description here

4) В viewLower, установлен сверху, ведущий, задний и высота ограничения для viewTitle. Для других подпрограмм здесь просто прикрепите их к верхней, нижней и сторон (не устанавливайте высоту).

enter image description here

enter image description here

5) Теперь, когда вы нажимаете кнопку, изменить ограничение высоты (heightConst, предположим) в viewUpper, как это:

self.heightConst.constant = 130 
self.view.setNeedsUpdateConstraints() 
self.view.layoutIfNeeded() 

Надежда это поможет вам.

+0

ваш ответ фактически не говорит о том, какое ограничение высоты установлено или как оно настроено. также, как бы вы использовали его на разных экранах размеров и тому подобное? – Wain

+0

@Wain - я отредактировал свой ответ и добавил изображения для лучшего понимания того, что я имел в виду, и да, это будет справедливо для всех размеров экрана. –

0

Чтобы решить вашу проблему, вам следует использовать layoutSubviews (метод UIView).

Это мой код:

Это ViewController.m:

#import "ViewController.h" 
#import "LowerView.h" 

@interface ViewController() 

@property UIView* viewUpper; 
@property LowerView* viewLower; 

@end 

@implementation ViewController 

- (void)viewDidLoad { 
[super viewDidLoad]; 
// Do any additional setup after loading the view, typically from a nib. 

float viewWidth = [UIScreen mainScreen].bounds.size.width - 40; 
_viewUpper = [[UIView alloc] initWithFrame:CGRectMake(20, 20, viewWidth, 200)]; 
_viewUpper.backgroundColor = [UIColor redColor]; 
[self.view addSubview:_viewUpper]; 

float lowerLocY = _viewUpper.frame.origin.y + _viewUpper.frame.size.height + 20; 
_viewLower = [[LowerView alloc] initWithFrame:CGRectMake(20, lowerLocY, viewWidth, 300)]; 
_viewLower.backgroundColor = [UIColor blueColor]; 
[self.view addSubview:_viewLower]; 

UITapGestureRecognizer* tapGR = [[UITapGestureRecognizer alloc] initWithTarget:self action:@selector(tapHandle)]; 
[_viewUpper addGestureRecognizer:tapGR]; 
} 

-(void)tapHandle{ 
NSLog(@"tagGR actived"); 
float moveDistance = 30; 
_viewUpper.frame = CGRectMake(_viewUpper.frame.origin.x, _viewUpper.frame.origin.y, _viewUpper.frame.size.width, _viewUpper.frame.size.height + moveDistance); 
_viewLower.frame = CGRectMake(_viewLower.frame.origin.x, _viewLower.frame.origin.y + moveDistance, _viewLower.frame.size.width, _viewLower.frame.size.height - moveDistance); 
} 

- (void)didReceiveMemoryWarning { 
[super didReceiveMemoryWarning]; 
// Dispose of any resources that can be recreated. 
} 

@end 

Это LowerView.m:

#import "LowerView.h" 

@interface LowerView() 

@property UIView* upView; 
@property UIView* lowView; 

@end 

@implementation LowerView 

-(id)initWithFrame:(CGRect)frame{ 
self = [super initWithFrame:frame]; 

_upView = [[UIView alloc] init]; 
_upView.backgroundColor = [UIColor greenColor]; 
[self addSubview:_upView]; 

_lowView = [[UIView alloc] init]; 
_lowView.backgroundColor = [UIColor yellowColor]; 
[self addSubview:_lowView]; 

return self; 
} 

-(void)layoutSubviews{ 
float padding = 5; 
float viewWidth = self.frame.size.width - 2*padding; 
_upView.frame = CGRectMake(padding, padding, viewWidth, 50); 

float lowerLocY = _upView.frame.origin.y + _upView.frame.size.height + padding; 
float lowViewHeight = self.frame.size.height-3*padding-_upView.frame.size.height; 
_lowView.frame = CGRectMake(padding, lowerLocY, viewWidth, lowViewHeight); 
} 

@end 

Надеется, что это может помочь вам.

+0

Это не означает, что OP использует ограничения для компоновки – Wain

Смежные вопросы