2010-03-19 27 views
7

Tôi có UITableViewCell tùy chỉnh chứa một số UIButtons. Vị trí khung của mỗi nút có liên quan đến chiều rộng ô. Tôi đặt autoresizingMask = UIViewAutoresizingFlexibleWidth để nó sẽ điều chỉnh chiều rộng ô và vị trí nút đúng khi ứng dụng bắt đầu với thiết bị ở chế độ ngang hoặc dọc.Xoay UITableViewCell tùy chỉnh

Vấn đề là khi thiết bị được xoay từ chế độ này sang chế độ khác, các nút không điều chỉnh vị trí vì UITableViewCell có thể sử dụng lại được. Nói cách khác, ô không được khởi tạo dựa trên chiều rộng UITalbeView mới vì hàm initWithStyle của ô được gọi trước khi thiết bị được xoay và không được gọi lại sau khi xoay thiết bị. Bất kỳ đề xuất?

+0

Kết thúc giải pháp đơn giản hơn rất nhiều. Nó chỉ cần thiết lập self.contentView.autoresizingMask = UIViewAutoresizingFlexibleWidth; self.contentView.autoresizesSubviews = YES; Nó không hoạt động bằng cách thiết lập self.autoresizingMask. –

+0

Tôi có cùng một vấn đề như bạn và đã nghĩ đến việc sử dụng các thẻ tế bào cụ thể cho từng trường hợp định hướng vì ý tưởng này đến với tôi sau khi suy nghĩ một lúc. Sử dụng self.contentView.autoresizesSubviews = YES không hoạt động trên mặt của tôi. – user255607

+0

Cuối cùng tôi đã sử dụng một mẹo khác. – user255607

Trả lời

7

Sau khi dành hàng giờ nghiên cứu (bao gồm cả bài đăng trên trang web này), tôi không thể tìm thấy bất kỳ giải pháp nào. Nhưng một bóng đèn bật đột ngột. Giải pháp này rất đơn giản. Chỉ cần phát hiện xem định hướng thiết bị là chế độ ngang hay dọc và xác định ReusableCellIdentifier với một tên khác cho mỗi thiết bị.

static NSString*Identifier; 

if ([UIDevice currentDevice].orientation!=UIDeviceOrientationLandscapeLeft && [UIDevice currentDevice].orientation!=UIDeviceOrientationLandscapeRight) { 
       Identifier= @"aCell_portrait"; 
      } 
      else Identifier= @"DocumentOptionIdentifier_Landscape"; 


    UITableViewCell *cell = [tableView dequeueReusableCellWithIdentifier:Identifier]; 
+1

Không hoạt động cho các ô tùy chỉnh ... –

6

Câu trả lời trước có vấn đề nghiêm trọng. Bạn nên sử dụng [UIApplication sharedApplication] .statusBarOrientation thay vì [UIDevice currebtDevice] định hướng vì định hướng thiết bị không liên quan gì đến định hướng giao diện - Hướng thiết bị xoay vòng vật lý dựa trên gia tốc kế.

+0

Cảm ơn bạn đã thông báo về tùy chọn thứ hai. Trong thực tế, cả hai đều có thể hoạt động. Xem http://stackoverflow.com/questions/2738734/get-current-orientation-of-ipad –

+2

Tôi xin lỗi, bạn không đúng.Hướng thiết bị có 6 tùy chọn khác nhau, trong khi định hướng giao diện có 4. Nếu thiết bị của bạn nằm trơn trên bàn, Hướng thiết bị sẽ báo cáo "Face Up", không có gì phổ biến cả với định hướng giao diện hiện tại. – Hrissan

+0

Hrissan, cảm ơn bạn đã sửa. –

1

Bạn cần sửa chiều rộng khung của ô (giả sử chiều cao giống nhau ở chế độ dọc và ngang) trong phương thức cellForRowAtIndexPath của bạn. Đó là những gì đang làm việc ở đây. Tôi đã từng tạo một TableViewCell tùy chỉnh với IB và nó luôn được khởi tạo cho chiều rộng 320 px dọc. Với việc xác định khung nó hoạt động như mong đợi, ngay cả khi ô được "tái sử dụng" từ hàng đợi.

- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath { 
... 
UITableViewCell *cell = (UITableViewCell *)[tableView dequeueReusableCellWithIdentifier:cellIdentifier]; 
if (cell == nil) { 
    // create cell here... 
} 

// Adjust cell frame width to be equal to tableview frame width 
cell.frame = CGRectMake(0, 0, tableView.frame.size.width, cell.frame.size.height); 
... 
} 
13

Vì UITableViewCell cũng là UIView, bạn có thể ghi đè phương thức setFrame. Mỗi lần xem bảng của bạn quay, phương thức này sẽ được gọi cho tất cả các ô.

-(void)setFrame:(CGRect)frame 
{ 
    [super setFrame:frame]; 

    //Do your rotation stuffs here :) 
} 
0

Tôi gặp vấn đề tương tự và bài đăng này đã giúp tôi. Trong trường hợp của tôi, tôi có một lớp tùy chỉnh khai báo trong một file riêng biệt, và trong tập tin này tôi có đoạn mã sau vào layoutSubviews:

//PORTRAIT CELL 
if ([UIDevice currentDevice].orientation!=UIDeviceOrientationLandscapeLeft && 
    [UIDevice currentDevice].orientation!=UIDeviceOrientationLandscapeRight) 
{ 
    //build the custom content views for portrait mode here 
} 
else 
{ 
    //build the custom content views for landscape mode here 
} 

Sau đó, trong điều khiển điểm của tôi, tôi chỉ thực hiện willAnimateRotationToInterfaceOrientation: và gửi tin nhắn reloadData để bàn của tôi lượt xem.

Với điều này, tôi không phải chạm vào phương thức cellForRow.

+1

bằng cách sử dụng layoutSubviews bạn không cần phải sử dụng reloadData và tốt hơn nếu bạn không sử dụng nó, bởi vì nếu bạn đang ở chế độ ấn bản với nút xóa được hiển thị và xoay, nút xóa sẽ biến mất vì reloadData – jcesarmobile

2

Câu trả lời được chọn hoạt động giống như sự quyến rũ trong các phiên bản iOS cũ. Đối với iOS 6.0, tôi đã sử dụng mã tiếp theo:

static NSString *Identifier; 
if (self.interfaceOrientation==UIInterfaceOrientationPortrait) { 
    [email protected]"aCell_portrait"; 
} 
else { 
    [email protected]"DocumentOptionIdentifier_Landscape"; 
} 

UITableViewCell *cell = [tableView dequeueReusableCellWithIdentifier:Identifier]; 
Các vấn đề liên quan