我在通用应用程序中有自定义UITableViewCell
,我必须为iPhone和iPad设置不同的框架,我必须考虑不同的方向,但无法识别设备的方向。 UIDeviceOrientation
出错了地方? UIDeviceOrientation
返回0
。
这是CustomCell.m
-(void) layoutCellPortrait{
if(UI_USER_INTERFACE_IDIOM()== UIUserInterfaceIdiomPhone){
//......frame subviews iPhone
}else{
//........frame subviews Ipad
}
}
-(void) layoutCellLandscape{
if(UI_USER_INTERFACE_IDIOM()== UIUserInterfaceIdiomPhone){
//.....frame subviews iPhone
}else{
//.......frame subviews Ipad
}
}
- (id)initWithStyle:(UITableViewCellStyle)style reuseIdentifier:(NSString *)reuseIdentifier
{
self = [super initWithStyle:style reuseIdentifier:reuseIdentifier];
if (self) {
UIDeviceOrientation deviceOrientation = [[UIDevice currentDevice]orientation];
NSLog(@"The orientation is è %d", deviceOrientation);//here return 0
if(deviceOrientation == UIInterfaceOrientationPortrait || deviceOrientation== UIInterfaceOrientationPortraitUpsideDown) {
[self layoutCellPortrait];
}
else if (deviceOrientation== UIInterfaceOrientationLandscapeRight){
[self layoutCellLandscape];
}
else if (deviceOrientation==UIInterfaceOrientationLandscapeLeft){
[self layoutCellLandscape];
}
[self.contentView addSubview:self.subviews];
}
return self;
}
答案 0 :(得分:2)
在你的类中实现旋转委托,每当轮换发生时,调用单元类中的方法,将此方向作为输入参数(假设您在表上调用reloadData
,而后者又调用此方法它位于cellForRowAtIndexpath
方法中。这应该在每次旋转时相应地重置帧。
<强>更新强>
在轮换委托中,
-(void)willRotateToInterfaceOrientation:(UIInterfaceOrientation)orientation duration:(NSTimeInterval)duration {
self.interfaceOrientation = orientation;
}
-(void)didRotateFromInterfaceOrientation:(UIInterfaceOrientation)fromInterfaceOrientation{
[self.tableView reloadData];
}
在tabelView cellForRowAtIndexPath
方法中,
- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath {
static NSString *cellIdentifier = @"cell";
CustomCell *cell = [tableView dequeueReusableCellWithIdentifier:cellIdentifier];
if (cell == nil) {
cell = [[[CustomCell alloc] initWithStyle: UITableViewCellStyleDefault reuseIdentifier:cellIdentifier] autorelease];
}
//code..
[cell rearrangeSubviewsForOrientation:self.interfaceOrientation];
return cell;
}
在cell
课程中添加此内容,
- (void)rearrangeSubviewsForOrientation:(UIInterfaceOrientation)orientation {
if(UI_USER_INTERFACE_IDIOM()== UIUserInterfaceIdiomPhone){
//iPhone
if(orientation == UIInterfaceOrientationPortrait || orientation== UIInterfaceOrientationPortraitUpsideDown) {
//portait
} else {
//landscape
}
} else {
//iPad
if(orientation == UIInterfaceOrientationPortrait || orientation== UIInterfaceOrientationPortraitUpsideDown) {
//portait
} else {
//landscape
}
}
}
答案 1 :(得分:2)
试试这个
-(void)layoutSubviews{
--- your code ----
}
注意:这是针对UITableViewCell
的子类的类如果你想在类中检测方向变化,这是UIViewController之类的子类,下面有一个名为 viewDidLayoutSubviews 的类似方法
- (void)viewDidLayoutSubviews{
--- your code ---
}
答案 2 :(得分:1)
对于Swift 3,如果您UIView
内的海关UITableViewCell
没有AutoLayout
,并且您希望在方向更改时更新用户界面,则可以在{{UITableViewCell
内执行此操作1}}自定义类:
override func layoutSubviews() {
super.layoutSubviews()
self.customView.layoutSubviews()
}
答案 3 :(得分:0)
其实我做过同样的事情。首先,您需要为不同的方向制作两个UITableViewCell.xib,然后在viewController中实现以下方法。
您无需在customCell.xib ViewController管理tabelView方向中自动检测设备方向。
-(void)didRotateFromInterfaceOrientation:(UIInterfaceOrientation)fromInterfaceOrientation{
if ([[UIDevice currentDevice] userInterfaceIdiom] != UIUserInterfaceIdiomPhone)
{
if(self.interfaceOrientation==UIInterfaceOrientationPortrait || self.interfaceOrientation==UIInterfaceOrientationPortraitUpsideDown)
{
}
else
{
}
}
else
{
}
[yourTable reloadData];
}
然后在你的tabelView CellForRowAtIndexPath方法中实现以下代码
if(self.interfaceOrientation==UIInterfaceOrientationPortrait || self.interfaceOrientation==UIInterfaceOrientationPortraitUpsideDown)
{
static NSString *CellIdentifier = @"Cell";
CategoryCell *cell = [tableView1 dequeueReusableCellWithIdentifier:CellIdentifier];
if (cell == nil) {
cell = [[[CategoryCell alloc] initWithStyle:UITableViewCellStyleValue2 reuseIdentifier:CellIdentifier] autorelease];
cell.autoresizingMask = UIViewAutoresizingFlexibleWidth;
}
}
else{
static NSString *CellIdentifier = @"Cell1";
CategoryCell1 *cell = [tableView1 dequeueReusableCellWithIdentifier:CellIdentifier];
if (cell == nil) {
cell = [[[CategoryCell1 alloc] initWithStyle:UITableViewCellStyleValue2 reuseIdentifier:CellIdentifier] autorelease];
cell.autoresizingMask = UIViewAutoresizingFlexibleWidth;
}
答案 4 :(得分:0)
你要看的两件事是:
首先,检查设备是否已旋转以使用
重新加载表格- (无效)didRotateFromInterfaceOrientation:(UIInterfaceOrientation)fromInterfaceOrientation { [self.tableView reloadData]; }
其次,在 - (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath中,使用UIInterfaceOrientationIsLandscape(self.interfaceOrientation)检查GUI状态以加载所需的布局。