2013-09-24 37 views
20

Tôi có một dự án được xây dựng vào năm ngoái và sử dụng XIB, không có bảng phân cảnh. XIB không sử dụng Bố cục Tự động, nhưng chúng sử dụng một số Tự động hóa. Tôi gặp sự cố khi chạy với iOS7, trong đó tất cả các chế độ xem được ẩn dưới thanh trạng thái. Tôi hoàn toàn hiểu đây là một tính năng mới với iOS7, trong đó điều này có thể được mong đợi. Tuy nhiên, tất cả các giải pháp khắc phục nó để không làm điều này không hoạt động. Tôi có một hình ảnh ở đầu chế độ xem luôn hiển thị bên dưới thanh trạng thái và tôi không sử dụng thanh điều hướng hoặc bất kỳ thứ gì như thế.iOS7 - Xem dưới thanh trạng thái - edgeForExtendedLayout không hoạt động

Tôi đã thử cập nhật Y-deltas trong XIB (chúng không ảnh hưởng đến chế độ xem), tôi đã thử đặt edgesForExtendedLayout thành UIRectEdgeNone (không có gì) và nhiều thứ khác. Mỗi lần, thanh trạng thái hiển thị với khung nhìn ẩn bên dưới nó, bất kể tôi làm gì .. trừ khi tôi di chuyển xuống khung nhìn trong XIB để cho phép chỗ cho thanh trạng thái (nhưng giải pháp đó không hiệu quả vì nó trông không ổn trong iOS6, tất nhiên).

Có gì kỳ lạ là ngay cả khi tôi cố gắng một dòng mã hack trong một lần xem ca, nó không hoạt động (như sau):

self.view.frame = CGRectMake(self.view.frame.origin.x, self.view.frame.origin.y+20, self.view.frame.size.width, self.view.frame.size.height); 

..Not rằng tôi sẽ đi với Đó là loại giải pháp, nhưng nó chỉ là lẻ mà nó không hoạt động (thời gian duy nhất tôi thường thấy rằng không làm việc là nếu Auto Layout được đặt ra, mà nó không phải trong trường hợp này).

Đây là yêu cầu thiết kế mà thanh trạng thái hiển thị và tôi chỉ bối rối vì sao tôi không thể đặt chế độ xem ở dưới thanh trạng thái cho iOS7. Tôi đã đọc từng bài đăng Stack Overflow duy nhất về chủ đề này cũng như các chuyển hướng/hướng dẫn của Apple. Một lần nữa, để nhắc lại, tôi hoàn toàn hiểu làm thế nào nó nên hoạt động và những gì các giải pháp dự kiến ​​nên được này, nhưng không ai trong số đó có vẻ là làm việc cho dự án cụ thể này.

Tôi là một nhà phát triển iOS có kinh nghiệm, nhưng dự án này được xây dựng bởi một nhóm khác, vì vậy tôi không biết có điều gì đó ẩn trong một số tệp XIB, plist hoặc mã có thể vượt trội hơn các cài đặt ở trên không. Vui lòng cho tôi biết nếu có điều gì khác có thể được xem xét về điều này hoặc có thể cung cấp thêm thông tin.

Cảm ơn trước!

+0

hey đã u nhận được bất kỳ giải pháp? tôi đang đối mặt với cùng một vấn đề. – Kalpesh

+0

Bất cứ ai có giải pháp ngay tại đó? –

Trả lời

17

Nếu bạn đặt giá trị delta 6/7 iOS trong Trình tạo giao diện, hãy nhớ đặt "Xem dưới dạng" thành "iOS 6" trên Tài liệu trình xây dựng giao diện vì đó là bố cục iOS 6 mà bạn muốn sao chép . Sau đó, các vùng đồng bằng sẽ chỉ được sử dụng trên iOS 7 để đẩy nội dung bên dưới thanh trạng thái. Nếu bạn để "Xem dưới dạng" được đặt thành iOS 7 (mặc định), các khu vực thay thế sẽ cung cấp cho bạn giao diện iOS 7 trên iOS 6.

Tuy nhiên, đồng bằng sẽ không giúp bạn đặt lại vị trí hoặc thay đổi kích thước chế độ xem dựa trên lập trình khung nhìn, vì khung không tính đến các vùng đồng bằng.

Thay vì sử dụng vùng đồng bằng, giải pháp tốt nhất tôi tìm thấy là bật Bố cục tự động trên XIB chính của bạn và sau đó đặt ràng buộc không gian trên cùng ở chế độ xem trên cùng/nội dung để thực hiện theo Hướng dẫn bố cục hàng đầu. Hướng dẫn này đã được giới thiệu trong iOS 7 và đại diện cho vị trí bên dưới thanh trạng thái. Rất tiếc, hướng dẫn không có sẵn trong Trình tạo giao diện khi không sử dụng Bảng phân cảnh nhưng bạn có thể thêm hướng dẫn theo chương trình.

Điều tôi đã làm là thêm ràng buộc không gian trên cùng vào superview thay vì trong Trình tạo giao diện và tạo lối thoát cho mã này trong mã.Sau đó, trong viewDidLoad, nếu topLayoutGuide có sẵn (iOS 7+), thay thế ràng buộc trong cửa hàng này bằng phiên bản sử dụng Hướng dẫn bố cục hàng đầu thay thế.

if ([self respondsToSelector:@selector(topLayoutGuide)]) { 
    [self.view removeConstraint:self.containerTopSpaceConstraint]; 

    self.containerTopSpaceConstraint = 
    [NSLayoutConstraint constraintWithItem:self.contentView 
           attribute:NSLayoutAttributeTop 
           relatedBy:NSLayoutRelationEqual 
            toItem:self.topLayoutGuide 
           attribute:NSLayoutAttributeBottom 
           multiplier:1 
            constant:0]; 

    [self.view addConstraint:self.containerTopSpaceConstraint]; 

    [self.view setNeedsUpdateConstraints]; 
    [self.view layoutIfNeeded]; 
} 
+0

Điều này có tác dụng di chuyển thanh của tôi ở phía trên cùng của màn hình xuống, đó là tốt, nhưng nó cũng làm cho nó để thanh trạng thái của tôi có một nền trắng thay vì một nền màu xám. – ArtOfWarfare

+0

Trên iOS 7 nền thanh trạng thái trong suốt. Đặt màu nền cho chế độ xem trên cùng của bạn (phía sau thanh trạng thái) thành bất kỳ màu nào bạn muốn thanh trạng thái có. –

+0

Tôi tìm thấy đặt lại self.view.frame. CÁM ƠN! – frank

6

Để tham khảo, giải pháp bên dưới đã hoạt động khi tôi áp dụng nó cho ViewControllers của mình. Tuy nhiên, nó không phải là lý tưởng và một chút hacky. Nếu đó là cách tiếp cận duy nhất tôi có thể thực hiện, thì cũng vậy.

float systemVersion=[[[UIDevice currentDevice] systemVersion] floatValue]; 
if(systemVersion>=7.0f) 
{ 
    CGRect tempRect; 
    for(UIView *sub in [[self view] subviews]) 
    { 
     tempRect = [sub frame]; 
     tempRect.origin.y += 20.0f; //Height of status bar 
     [sub setFrame:tempRect]; 
    } 
} 
+0

hey Tôi đã sử dụng mã ở trên nhưng chế độ xem này xuất hiện dưới thanh điều hướng và tôi muốn nó nằm trên thanh điều hướng. Vui lòng trợ giúp nếu bạn có bất kỳ giải pháp nào khác. –

5

Apple đang đẩy bạn sử dụng tự động hoàn thành để thực hiện việc này. Bạn cần đặt ràng buộc cho "Hướng dẫn bố cục hàng đầu" từ chế độ xem phụ trên cùng trong chế độ xem của bạn.

Xem tài liệu này cho ví dụ:

https://developer.apple.com/library/ios/qa/qa1797/_index.html

Để làm điều này mà không XIBs, bạn sẽ cần phải thêm các hạn chế chương trình khác. Tài liệu của Apple đưa ra một ví dụ điển hình về điều này, mà tôi đã tóm tắt dưới đây.

Cho rằng topLayoutGuide là thuộc tính trên bộ điều khiển chế độ xem, bạn chỉ cần sử dụng nó trong từ điển liên kết biến. Sau đó, bạn thiết lập ràng buộc của mình như bình thường:

id topGuide = [myViewController topLayoutGuide]; 
NSDictionary *viewsDictionary = NSDictionaryOfVariableBindings(button, topGuide); 
NSArray *constraints = [NSLayoutConstraint constraintsWithVisualFormat:@"V:[topGuide]-20-[button]" options:0 metrics:nil views:viewsDictionary]; 

Tài liệu này có thể được tìm thấy in the UIViewController class reference.

+1

Bạn không thể đặt ràng buộc với Hướng dẫn bố cục hàng đầu từ Trình tạo giao diện nếu bạn đang sử dụng XIB, chỉ khi bạn đang sử dụng bảng phân cảnh. Vì vậy, câu hỏi vẫn còn, làm thế nào để bạn tạo ra ràng buộc này lập trình? –

+0

@PhillApley Xem câu trả lời đã chỉnh sửa của tôi về cách thực hiện theo cách lập trình. – petehare

+0

Tôi không thể thấy cách bạn sử dụng hạn chế với UITableView .. – shul

3

1) Giải pháp đơn giản nhất nếu bạn không nhớ có một thanh điều hướng đục: Câu trả lời

self.navigationController.navigationBar.translucent = NO; 

2) svguerin3 của không thể làm việc trong trường hợp tổng quát. Ví dụ: nếu một trong các bản xem trước của bạn sử dụng tự động để được nối ở cuối vùng chứa, thì vị trí mới của nó sẽ sai. Và nó có thể đi ra khỏi màn hình trong trường hợp xấu nhất.

+0

Đã thử, không hoạt động. Đây có lẽ là vấn đề đáng ghét nhất mà tôi từng có. – ArtOfWarfare

2
- (void)viewDidAppear:(BOOL)animated { 
     [self.view setFrame:CGRectMake(0, 20, self.view.frame.size.width, self.view.frame.size.height)]; 
// OR 
     self.view.transform = CGAffineTransformMakeTranslation(0, 20); 
} 
0

Bạn đã thử xem XIB của mình dưới dạng nguồn và xóa bất kỳ dòng nào chứa edgeforextendedlayout ??

Chúng tôi phải loại bỏ dòng này trong những cảnh kịch bản của chúng tôi kể từ quan điểm chính cảnh kịch bản của chúng tôi được đại diện bởi XIBs

gì đã xảy ra cho chúng ta là bằng cách nào đó, ở một số cảnh, nội dung XIB cho khung nhìn chính của cảnh đang bị đẩy xuống bởi chiều cao của thanh trạng thái và thanh điều hướng.

Xóa dòng đó cho phép các XIB được hiển thị như thể hàng đầu của chúng có nguồn gốc ở cùng một đầu cảnh của bảng phân cảnh.

Đáng buồn thay, chúng tôi không biết điều gì đã kích hoạt điều này, nhưng tôi thấy nó xảy ra khi thay đổi thứ tự nội dung trong khung nhìn chính của XIB để UITextView xuất hiện trước tiên. Sắp xếp lại thứ tự các mục sau khi điều này được kích hoạt không có tác dụng trong việc loại bỏ hành vi không mong muốn này.

Hy vọng điều này sẽ giúp bất kỳ ai khác gặp phải loại sự cố này.

0

Nếu bạn đang sử dụng các kịch bản, sau khi cài đặt cách bố trí trên cùng của cái nhìn của bạn, bạn có thể bỏ chọn "Dưới Bars Opaque" trong Attributes Inspector

Storyboard

Các vấn đề liên quan