Ios 当对象不可见时更改布局
我在屏幕上有4个对象:(UIView或UIButton) 在某些情况下,我需要隐藏其中一个或多个,这将导致:Ios 当对象不可见时更改布局,ios,objective-c,cocoa-touch,ios5,Ios,Objective C,Cocoa Touch,Ios5,我在屏幕上有4个对象:(UIView或UIButton) 在某些情况下,我需要隐藏其中一个或多个,这将导致: A C D 或者这个: A D 在iOS 5中(不能使用自动布局)(除了使用大量的ifs并以编程方式设置位置之外)是否有办法修剪空间并强制上面的示例如下所示: A C D A D 我使用KVO实现了这一点。 步骤1:注册ViewController作为所有视图中隐藏属性更改的观察者 [_view1 addObserver:self forKeyPath:@"hidd
A C D
或者这个:
A D
在iOS 5中(不能使用自动布局
)(除了使用大量的ifs并以编程方式设置位置之外)是否有办法修剪空间并强制上面的示例如下所示:
A C D
A D
我使用KVO实现了这一点。
步骤1:注册
ViewController
作为所有视图中隐藏属性更改的观察者
[_view1 addObserver:self forKeyPath:@"hidden" options:NSKeyValueObservingOptionNew|NSKeyValueObservingOptionOld context:NULL];
[_view2 addObserver:self forKeyPath:@"hidden" options:NSKeyValueObservingOptionNew|NSKeyValueObservingOptionOld context:NULL];
[_view3 addObserver:self forKeyPath:@"hidden" options:NSKeyValueObservingOptionNew|NSKeyValueObservingOptionOld context:NULL];
[_view4 addObserver:self forKeyPath:@"hidden" options:NSKeyValueObservingOptionNew|NSKeyValueObservingOptionOld context:NULL];
步骤2:在ViewController
- (void)observeValueForKeyPath:(NSString *)keyPath ofObject:(id)object change:(NSDictionary *)change context:(void *)context{
if(![object isEqual:[viewArray lastObject]]){
UIView *viewToHide = (UIView *)object;
CGRect newFrame = viewToHide.frame;
CGRect oldFrame;
int indexOfObject = [viewArray indexOfObject:object];
for(int i = indexOfObject + 1; i < viewArray.count; i++){
UIView *viewToChange = [viewArray objectAtIndex:i];
if(viewToChange.hidden){
continue;
}
else{
oldFrame = viewToChange.frame;
viewToChange.frame = newFrame;
[viewArray replaceObjectAtIndex:i withObject:viewToChange];
newFrame = oldFrame;
}
}
}
}
我想没有简单的办法。您需要编写代码来更改帧或变换。幸运的是,我只有1-4个对象要显示。如果我需要显示和隐藏大约10个对象,该怎么办?这是很多ifs。使用键值观察(KVO)。当一个视图被隐藏时,您将得到消息,因此您可以改变其他视图。在那种情况下,你不需要太多的“如果”。
- (void)observeValueForKeyPath:(NSString *)keyPath ofObject:(id)object change:(NSDictionary *)change context:(void *)context{
if(![object isEqual:[viewArray lastObject]]){
UIView *viewToHide = (UIView *)object;
CGRect newFrame = viewToHide.frame;
CGRect oldFrame;
int indexOfObject = [viewArray indexOfObject:object];
for(int i = indexOfObject + 1; i < viewArray.count; i++){
UIView *viewToChange = [viewArray objectAtIndex:i];
if(viewToChange.hidden){
continue;
}
else{
oldFrame = viewToChange.frame;
viewToChange.frame = newFrame;
[viewArray replaceObjectAtIndex:i withObject:viewToChange];
newFrame = oldFrame;
}
}
}
}
- (IBAction)viewTapped :(UIGestureRecognizer *)recogniser{
CGPoint touchPoint = [recogniser locationInView:self.view];
UIView *touchView = [self.view hitTest:touchPoint withEvent:nil];
if([touchView isKindOfClass:[UIView class]]){
touchView.hidden = YES;
}
}