画面上に 4 つのオブジェクトがあります: (UIView または UIButton)
A B C D
場合によっては、次のような結果になる 1 つまたは複数を非表示にする必要があります。
A C D
またはこれ:
A D
iOS 5 ( Can't useAutoLayout
) (多くのifを使用し、プログラムで場所を設定する以外に) スペースをトリミングし、上記の例を次のように強制する方法はありますか?
A C D
A D
画面上に 4 つのオブジェクトがあります: (UIView または UIButton)
A B C D
場合によっては、次のような結果になる 1 つまたは複数を非表示にする必要があります。
A C D
またはこれ:
A D
iOS 5 ( Can't useAutoLayout
) (多くのifを使用し、プログラムで場所を設定する以外に) スペースをトリミングし、上記の例を次のように強制する方法はありますか?
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;
}
}
}
}
ステップ 3:ビューをタップするとビューが非表示になります。もちろん、これはどのような方法でも実現できます。
- (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;
}
}