2015-05-19 26 views
51

Tiện ích mở rộng Ngày hôm nay của tôi cần phải có chiều cao động dựa trên nội dung mà tiện ích đang hiển thị. Tôi đã có thể đạt được điều này bằng cách thêm một ràng buộc vào phần tử dưới cùng của tôi: đỉnh của hướng dẫn bố trí dưới cùng nhỏ hơn hoặc bằng đáy của phần tử đáy nhất, với hằng số là 0, ưu tiên 999, hệ số 1.Hôm nay Chiều cao mở rộng cho iPad lớn hơn nhiều so với quy định

hoạt động chính xác như mong đợi trên iPhone - chiều cao tiện ích phù hợp với tất cả nội dung cộng với lề dưới mặc định được áp dụng trước khi tiện ích con tiếp theo được hiển thị. Tuy nhiên, trên iPad có vẻ như thiết lập chiều cao của widget của tôi bằng với chiều cao tối đa Trung tâm thông báo sẽ cho phép một widget - có rất nhiều không gian bên dưới tiện ích của tôi, nó gần như toàn màn hình.

Làm cách nào tôi có thể xóa thêm không gian đó?

Tôi biết chính xác vấn đề là gì nhưng không chắc chắn cách giải quyết vấn đề - xem phần "Sự cố". Trước tiên cho tôi giải thích các thiết lập:

Setup:
tôi đặt quan điểm của tiện ích này lên trong một kịch bản, không có gì được thực hiện theo chương trình. Chế độ xem bao gồm 5 phần tử được xếp chồng lên nhau theo chiều dọc và một số phần tử khác theo chiều ngang. Đây là những hạn chế bố trí tự động cho rằng đường thẳng đứng từ trên xuống dưới - nơi không được nêu ưu tiên là 1000, hệ số 1:

UILabel: height = 35, top space to top layout guide with constant of 10 
UIButton: equal height and width to a different button (whose aspect ratio is 1:1, there is no fixed width/height), top space to label 10 
UIButton: equal height and width to same button, top space to above button 8 
UIButton: equal height and width to same button, top space to above button 8 
UIButton: equal height and width to same button, top space to above button 8, bottom space to bottom layout guide <= 0 with priority 999 

Các hành vi cần thiết:

  • Tôi cần một mạng lưới các Các nút 4x4 nằm bên dưới một nhãn có độ rộng đầy đủ duy nhất
  • Mỗi nút phải có cùng chiều rộng và chiều cao chính xác - tất cả các ô vuông hoàn hảo
  • Không có khoảng trống thừa bên dưới r cuối cùng ow các nút

Kết quả:
enter image description here

kết quả mong đợi:
enter image description here

Vấn đề:
Các hạn chế tỉ lệ trên tất cả các nút kết thúc gián tiếp áp đặt một khía cạnh 'ngầm' tio hạn chế trên chiều cao của chế độ xem tiện ích khi được gửi systemLayoutSizeFittingSize:withHorizontalFittingPriority:verticalFittingPriority:, khi nó được thông qua chiều rộng cần thiết (724) cho bố cục ở mức độ ưu tiên bắt buộc và chiều cao là 0 (để nén chế độ xem) ở mức độ ưu tiên phù hợp. Điều này dẫn đến chế độ xem tiện ích cao trên iPad, nơi chế độ xem rộng hơn để bắt đầu. Nhưng không có ràng buộc tỷ lệ khía cạnh thực tế có thể được loại bỏ. Về cơ bản, bởi vì tôi đã áp dụng các ràng buộc tỉ lệ cho tất cả các nút, chiều cao của phần mở rộng ngày nay phụ thuộc vào chiều rộng của nó (xem xét tất cả các ràng buộc với nhau, tỉ lệ và tỷ lệ khác). Vì vậy, chiều cao của phần mở rộng là vô ích trong một khu vực rộng, biểu hiện chính nó trên một thiết bị rộng như iPad. Các ràng buộc trên các nút cần được xem xét lại, hoặc bằng cách nào đó được điều chỉnh.

Các mẫu dự án:
Một sample project that demonstrates the issue có sẵn từ CloudApp để bạn có thể tải về và chơi với nó.

Những gì tôi đã thử:
tôi đã cố gắng loại bỏ các insets lề mặc định bằng cách ghi đè widgetMarginInsetsForProposedMarginInsets và trở 0 cho phía dưới. Điều này đã loại bỏ padding mặc định, do đó giảm chiều cao một chút, nhưng vẫn còn rất nhiều không gian thêm bên dưới nó.

Các UILabel có một hạn chế về nó: nhãn của hàng đầu bằng hàng đầu SuperView của - liên tục 0, ưu tiên 1000, số nhân 1. Nếu tôi chỉ đơn giản là thay đổi điều đó để hàng đầu thế SuperView lề, đáy thêm khoảng cách kỳ diệu biến mất. Tôi tự hỏi liệu đó có phải là vì các yếu tố đã trở nên quá lớn, vì vậy việc tăng khoảng cách trái sẽ làm giảm kích thước của chúng, nhưng tôi đã cố gắng giữ nó ở vị trí dẫn đầu và tăng hằng số và điều đó không giải quyết được vấn đề. Nhưng điều này chỉ giải quyết vấn đề cho iPad theo chiều dọc. Và nó thậm chí không hoàn toàn giải quyết nó, mỗi khi bạn kéo xuống Trung tâm thông báo nó bắt đầu ở độ cao lớn sau đó co lại xuống kích thước thích hợp. Trong cảnh quan, nó không bao giờ co lại thành kích thước phù hợp.

Solutions đã thử:

  • @Lefteris đề xuất thể xác định rõ kích thước, mà sẽ không làm việc trong trường hợp này như chiều cao là năng động và widget có sẵn cho nhiều màn hình kích thước/phương hướng.
  • @Yuyutsu đã cố giải quyết nó, nhưng rất tiếc là không đáp ứng được các yêu cầu và thể hiện các ràng buộc xung đột và bố cục được sửa đổi.
+0

tôi có một số vấn đề lạ về chiều cao của tiện ích mở rộng ngày hôm nay cách đây vài ngày, hãy đọc FYI này: http://stackoverflow.com/questions/26087907/height-of-ios8-today-extension-using-only-auto-layout-gives-broken-constraints – liushuaikobe

+0

thử làm cho xem mở rộng như là một subview của bộ điều khiển xem tùy chỉnh khác và sau đó áp dụng viewDidLoad() trong nó, nó sẽ làm việc –

Trả lời

-1

tôi phải hardcode giá trị của widget vào phương pháp viewDidLoad đại biểu để sửa lỗi này:

import UIKit 
import NotificationCenter 

class TodayViewController: UIViewController, NCWidgetProviding { 

    override func viewDidLoad() { 
     super.viewDidLoad() 
     self.preferredContentSize = CGSize(width: 0, height: 320) 
    } 

} 
+1

Nó không thể được mã hóa cứng, nó thực sự cần phải được năng động về chiều cao dựa trên nội dung. Phải hoạt động với tất cả iPhone và iPad và bất kỳ kích thước màn hình nào khác trong tương lai. – Joey

+0

Khó mã hóa chiều cao gần như chắc chắn sẽ thất bại trong một số tình huống-- ví dụ, ở chế độ ngang. Hãy thử điều này: Chạy Mobile Safari, chuyển sang chế độ ngang, sau đó mở trung tâm thông báo. –

0

tôi đã phải đối mặt với cùng một vấn đề. Bạn đã thêm giới hạn đệm dưới như được hiển thị trong hình ảnh chưa? enter image description here

Đó làm việc cho me.Hope nó giúp

2

enter image description here

Dưới đây là làm thế nào để đạt được điều này:

  1. Bạn nên cân nhắc hạn chế của bạn.

  2. bạn insets lề widget mặc định không được cấu hình đúng trên con đường bạn mong muốn nó, vì vậy thiết lập này một mình là cách giải quyết duy nhất ở đây bằng cách gọi 'widgetMarginInsetsForProposedMarginInsets:'

// Cập nhật widget insets

func widgetMarginInsetsForProposedMarginInsets(defaultMarginInsets: UIEdgeInsets) -> UIEdgeInsets { 

    println(NSStringFromUIEdgeInsets(defaultMarginInsets)) 
    return UIEdgeInsetsMake(20, 20, 10, 20) 
} 

Modified liên kết tập tin mẫu: Modified file

+0

Các nút cần phải là hình vuông hoàn hảo – Joey

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