在iOS7之前,无论我为UIView的框架定义了什么CGRect,它都在工作。
例如:
imageView.frame=CGRectMake(20,20,80,80);
完全在屏幕左上方留下20 x 20的边距。
有趣的是,如果我添加另一个UIView:
nextView.frame=CGRectMake(imageView.frame.origin.x+imageView.frame.size.width+10,20,100,100);
nextView出现在imageView附近,所以它以某种方式接受第二个视图的X参数,但它也不接受该视图的Y坐标。
现在,我必须使用viewWillLayoutSubviews
来安排所有这些坐标。否则,例如,imageView
的框架会自动变为0,0,80,80
。 (它快照左上角)
我没有使用任何笔尖,我甚至尝试使用自定义UIViewController
方法创建initWithFrame
,以便在CGRect
或loadView
之前设置viewDidLoad
,但它没关系。
是否有某些内容会自动覆盖视图中的x,y?像自动布局系统等?我不想使用viewWillLayoutSubviews
方法重新排列所有这些坐标。
这里发生了什么?
更新1
- (id)initWithFrame:(CGRect) frame
{
self = [super init];
if (self) {
self.frame=frame; //frame is custom variable to hold it until loadViews method
}
return self;
}
- (void)viewDidLoad
{
[super viewDidLoad];
}
-(void)loadView{
UIView *view=[[UIView alloc]initWithFrame:_frame];
view.backgroundColor=[UIColor blackColor];
self.imageView=[[UIImageView alloc]initWithFrame:CGRectMake(20, 20, 80,80)];
self.imageView.backgroundColor=[UIColor redColor];
[view addSubview:_imageView];
self.textView=[[UITextView alloc]initWithFrame:CGRectMake(self.imageView.frame.origin.x+self.imageView.frame.size.width+10, self.imageView.frame.origin.y, view.frame.size.width-20-(self.imageView.frame.origin.x+self.imageView.frame.size.width+10), view.frame.size.height-self.imageView.frame.origin.y-20)];
[view addSubview:_textView];
self.view=view;
}
我在initWithFrame和viewDidLoad中尝试过类似的代码。结果是一样的。
更新2
我在问题中错误地写了“layoutSubviews”而不是“viewWillLayoutSubviews”,所以我修复了它:我没有创建自定义UIView而是UIViewController,所以它必须是问题中的“viewWillLayoutSubviews”。
答案 0 :(得分:0)
我的猜测是你正在将状态栏反转为左上角,但在iOS7中状态是透明的,顶点是屏幕的实际左上角。
您可以更改坐标或将其添加到视图控制器:
if([self respondsToSelector:@selector(setEdgesForExtendedLayout:)])
{
[self setEdgesForExtendedLayout:UIRectEdgeNone];
}
这会将您的左上角重置为状态栏的底部。
无论如何,我相信将您的布局代码放在这些方法中:
- (void)viewWillLayoutSubviews
- (void)viewDidLayoutSubviews
答案 1 :(得分:0)
每当添加子视图时,都会滚动UIScrollView,为View设置Frame,layoutSubViews?被称为,