G'day伙计们,
我最初使用iOS6.1定位iPhone,但是欢迎使用iOS5.1在iPhone上运行完美无缺的提示和代码。
我有一个自定义的UITableViewCell,其中有7个不同的标签作为子视图:
-(id) initWithStyle: (UITableViewCellStyle) style reuseIdentifier: (NSString*) reuseIdentifier
{
self = [super initWithStyle : style reuseIdentifier : reuseIdentifier] ;
if (self){
//Adding Subviews
[self.contentView addSubView : self.myLabel1] ;
[self.contentView addSubView : self.myLabel2] ;
[self.contentView addSubView : self.myLabel3] ;
[self.contentView addSubView : self.myLabel4] ;
[self.contentView addSubView : self.myLabel5] ;
[self.contentView addSubView : self.myLabel6] ;
[self.contentView addSubView : self.myLabel7] ;
}
return self;
}
当我懒惰地实例化标签时,我认为起始方向是纵向,标签排列在两个不同的行上:
-(UILabel*) myLabel1
{
if (!_myLabel1){
_myLabel1 = [UILabel alloc] initWithFrame: CGRectMake(10,30,40,20);
_myLabel1.numberOfLines = 1;
_myLabel1.opaque = YES;
}
return _myLabel1;
}
-(UILabel*) myLabel2
{
if (!_myLabel2){
_myLabel2 = [UILabel alloc] initWithFrame: CGRectMake(50,30,40,20);
_myLabel2.numberOfLines = 1;
_myLabel2.opaque = YES;
}
return _myLabel2;
}
-(UILabel*) myLabel3
{
if (!_myLabel3){
_myLabel3 = [UILabel alloc] initWithFrame: CGRectMake(90,30,40,20);
_myLabel3.numberOfLines = 1;
_myLabel3.opaque = YES;
}
return _myLabel3;
}
-(UILabel*) myLabel4
{
if (!_myLabel4){
_myLabel4 = [UILabel alloc] initWithFrame: CGRectMake(10,60,40,20);
_myLabel4.numberOfLines = 1;
_myLabel4.opaque = YES;
}
return _myLabel4;
}
-(UILabel*) myLabel5
{
if (!_myLabel5){
_myLabel5 = [UILabel alloc] initWithFrame: CGRectMake(50,60,40,20);
_myLabel5.numberOfLines = 1;
_myLabel5.opaque = YES;
}
return _myLabel5;
}
-(UILabel*) myLabel6
{
if (!_myLabel6){
_myLabel6 = [UILabel alloc] initWithFrame: CGRectMake(90,60,40,20);
_myLabel6.numberOfLines = 1;
_myLabel6.opaque = YES;
}
return _myLabel6;
}
-(UILabel*) myLabel7
{
if (!_myLabel7){
_myLabel7 = [UILabel alloc] initWithFrame: CGRectMake(130,60,40,20);
_myLabel7.numberOfLines = 1;
_myLabel7.opaque = YES;
}
return _myLabel7;
}
我想问一下实现这个目标的最佳方法是什么:
“如果方向为纵向,则将标签排列在上述2条不同的线条上,如果方向为横向,则将所有标签排列在一条线上。如果用户更改方向,则重新排列应该是自动的。
横向模式中的重新排列应使所有标签与y值对齐(第一行不是30,第二行是60)。标签4,5,6,7的x值也应该改变,因为它们不是放在标签1,2,3下面,而是放在标签3的右边。“
顺便说一下,我发现有时在真正的iPhone上启动应用程序会在桌面上保留“肖像”,因此iOS 5.1和iIOS 6.1都会错误地将该方向报告为“风景”。我发现这是因为我开始玩layoutSubviews:因为我认为这是重新排列视图的最佳位置,根据设备的方向为每个视图创建一个新框架。这是自动布局的最佳案例吗?该视图将以编程方式创建。
由于
尼古拉
答案 0 :(得分:0)
感谢您的回答Kalpesh,但实际上经过多次试验后,我发现处理它的最佳方法是在UITableViewCell中指向其控制器并使用它来获取新的方向然后在layoutSubviews中重新排列:
@property(weak,nonatomic) UITableViewController *controller;
-(void) layoutSubviews
{
[super layoutSubviews];
if ([[UIDevice currentDevice] userInterfaceIdiom] == UIUserInterfaceIdiomPhone){
// I am on a Phone
NSLog(@"The new controller orientation is: %u", self.controller.interfaceOrientation);
if(self.controller.interfaceOrientation == UIInterfaceOrientationPortrait){
NSLog(@"Phone - Controller orientation: Portrait.");
//Layout the subviews for portrait orientation
self.myLabel1.frame = CGRectMake(10,70,(self.frame.size.width-20)/4,20);
//..
} else{
NSLog(@"Phone - Controller orientation: Landscape.");
//Layout the subviews for landscape orientation
self.myLabel1.frame = CGRectMake(10,30,(self.frame.size.width-20)/4,20);
//..
}
} else if ([[UIDevice currentDevice] userInterfaceIdiom] == UIUserInterfaceIdiomPad){
// I am on a Pad
if(self.controller.interfaceOrientation == UIInterfaceOrientationPortrait){
NSLog(@"Pad - Controller orientation: Portrait.");
//Layout the subviews for portrait orientation
} else{
NSLog(@"Pad - Controller orientation: Landscape.");
//Layout the subviews for landscape orientation
}
}
}
无论如何,按照你的建议刷新表可能对改变8行有用!
编辑:当方向改变时,单元格高度会自动重新加载,因此无需强制重新加载表格。 尼古拉