我在这里找到了一个解决方案How to flip an individual UIView (without flipping the parent view)
但似乎这对我不起作用。在Interface Builder中,我已经使用uiview设置了所有内容,并在两个uiviews内部,大小相同,第一个视图显示在顶部,我为这3个视图创建了三个出口。
在viewDidLoad中:
[self.view addSubview:self.contentView]
[self.contentView addSubview:firstView]
[self.contentView addSubview:secondView]
我有一个uigesture。当用户点击屏幕时,IBAction执行翻转:
-(IBAction)flip:(id *)sender
{
if(faceUp){
// execute transition from firstview to second
}else{
//execute transition from secondview to first
}
faceUp = !faceUp;
}
这项工作完全是我第一次点击并翻转从第一次到第二次,然后如果我再次点击翻转开始然后它没有任何结束,视图消失并保持容器视图显示什么,因为它的颜色是设置清除。 我怎么解决这个问题?
这是带有轻击手势方法和三个插座的控制器:
#import "ContactViewController.h"
#import "InfoContactView.h"
#import "ImageLogoView.h"
@interface ContactViewController ()
@property (strong, nonatomic) IBOutlet InfoContactView *contactInfoView;
@property (strong, nonatomic) IBOutlet ImageLogoView *imageLogoView;
@property (nonatomic) BOOL faceUp;
@property (strong, nonatomic) IBOutlet UIView *parentView;
@end
@implementation ContactViewController
- (id)initWithNibName:(NSString *)nibNameOrNil bundle:(NSBundle *)nibBundleOrNil
{
self = [super initWithNibName:nibNameOrNil bundle:nibBundleOrNil];
if (self) {
// Custom initialization
}
return self;
}
- (void)viewDidLoad
{
[super viewDidLoad];
// Do any additional setup after loading the view.
self.parentView.backgroundColor =[UIColor clearColor];
[self.view addSubview:self.parentView];
[self.parentView addSubview:self.contactInfoView];
[self.parentView addSubview:self.imageLogoView];
self.faceUp = NO;
}
- (void)didReceiveMemoryWarning
{
[super didReceiveMemoryWarning];
// Dispose of any resources that can be recreated.
}
-(void)setFaceUp:(BOOL)faceUp
{
_faceUp = faceUp;
}
-(void)setParentView:(UIView *)parentView
{
_parentView =parentView;
}
-(void)setContactInfoView:(InfoContactView *)contactInfoView
{
_contactInfoView = contactInfoView;
}
-(void)setImageLogoView:(ImageLogoView *)imageLogoView
{
_imageLogoView = imageLogoView;
}
- (IBAction)showInfo:(UITapGestureRecognizer *)sender {
if (self.faceUp == NO) {
[UIView transitionFromView:self.imageLogoView toView:self.contactInfoView
duration:1.5
options:UIViewAnimationOptionTransitionFlipFromLeft
completion:NULL];
NSLog(@"Pass from logo to info : imageLogoView = %@",self.imageLogoView.description);
NSLog(@"dettagli = %@",self.contactInfoView);
}
else if(self.faceUp == YES){
[UIView transitionFromView:self.contactInfoView toView:self.imageLogoView
duration:1.5
options:UIViewAnimationOptionTransitionFlipFromRight
completion:NULL];
NSLog(@"Pass from info to logo: imageLogoView = %@",self.imageLogoView.description);
NSLog(@"dettagli = %@",self.contactInfoView);
}
self.faceUp = !self.faceUp;
}
@end
答案 0 :(得分:0)
我试图在Xcode中重建你的问题。我在每次转换之前和之后添加了一些代码行来记录parentView
的子视图。从日志中判断,您的初始视图的框架(self.imageLogoView
)在某个时刻重置为宽度和高度为0:
<UIView: 0x8b84310; frame = (159.5 284.5; 0 0); autoresize = W+H; layer = <CALayer: 0x8b84370>>
这意味着它仍然存在但你却看不到它。
显然 Autolayout负责调整视图框架的大小。如果您为View Controller停用Autolayout,则转换工作正常。 (要取消激活Autolayout,请在故事板中选择相应的View Controller。在右栏(实用工具)转到第一个选项卡并取消选中“Use Autolayout”。)
另一方面,Autolayout被认为是一件好事,或者至少它被Apple推广。因此,如果您希望使用Autolayout,您必须通过添加适当的约束来自己处理视图的框架。首先选择您的imageLogoView
并通过选中相应的框添加宽度和高度的约束,如下面的屏幕截图所示。然后对您的contactInfoView
执行相同操作。
这应该可以解决问题。