2012-12-27 22 views
9

Tôi muốn trình bày bộ điều khiển chế độ xem có kích thước tùy chỉnh với hoạt ảnh từ dưới cùng. Tôi có thể đạt được hoạt ảnh này với ModalPresentationStyle đến FormSheet, nhưng it forces me to use the default size which is 540x620 và chế độ xem của tôi không phù hợp.Làm thế nào để trình bày một bộ điều khiển xem phương thức với kích thước tùy chỉnh ở trung tâm?

Làm cách nào để thực hiện chuyển đổi tương tự sang chế độ xem có kích thước tùy ý (bộ điều khiển) được đặt ở giữa màn hình?

Trả lời

4

tôi không tìm thấy một cách để làm điều đó từ bộ điều khiển phương thức riêng của mình vì vậy tôi tạo ra một lớp và một phương pháp khuyến nông:

public class ModalViewController : UIViewController 
{ 
    public SizeF OriginalViewSize { get; private set; } 

    void Initialize() 
    { 
     ModalPresentationStyle = UIModalPresentationStyle.FormSheet; 
    } 

    public override void ViewDidLoad() 
    { 
     OriginalViewSize = View.Bounds.Size; 
     base.ViewDidLoad(); 
    } 

    public ModalViewController (IntPtr handle) : base (handle) 
    { 
     Initialize(); 
    } 

    public ModalViewController (string nibName, NSBundle bundle) : base (nibName, bundle) 
    { 
     Initialize(); 
    } 

    public ModalViewController() : base() 
    { 
     Initialize(); 
    } 
} 

public static class ModalViewControllerExtensions 
{ 
    public static void PresentModalViewController (this UIViewController parent, ModalViewController target) 
    { 
     parent.PresentViewController (target, true, null); 

     target.View.Superview.AutoresizingMask = UIViewAutoresizing.FlexibleMargins; 
     target.View.Superview.Frame = new RectangleF (PointF.Empty, target.OriginalViewSize); 
     target.View.Superview.Center = UIScreen.MainScreen.Bounds.Center().Rotate(); 
    } 
} 

Đây là khoảng cách tôi sử dụng nó:

this.PresentModalViewController (
    new PublishModalViewController (Item, HandlePublishAction) 
); 

Thuận tiện là tôi không cần chỉ định kích thước rõ ràng vì nó sử dụng các giới hạn của khung nhìn gốc từ trình tạo giao diện. Tôi không chắc làm thế nào phản ứng này để autorotate, nó có thể cần một số điều chỉnh. Tôi cũng đang sử dụng hai phương pháp mở rộng tại đây:

public static PointF Rotate (this PointF pt) 
{ 
    return new PointF (pt.Y, pt.X); 
} 

public static PointF Center (this RectangleF rect) 
{ 
    return new PointF (
     (rect.Right - rect.Left)/2.0f, 
     (rect.Bottom - rect.Top)/2.0f 
     ); 
} 

Và đây là nó.

+0

Quiet brilliant ... –

+0

Điều đó có vẻ không giống bất kỳ mã iOS nào tôi đã xem. Bạn có thể vui lòng hiển thị điều này chi tiết hơn/ví dụ thực tế không? – iOSProgrammingIsFun

+1

@iOSProgrammingIsFun Câu hỏi này có thẻ MonoTouch (hiện được gắn nhãn là [Xamarin.iOS] (http://xamarin.com/ios)). Đó là một nền tảng để viết trong C# đối với các API của Apple. –

3

Một cách dễ dàng hơn là sau

hiện bộ điều khiển xem phương thức như một tấm hình và trong giao diện điều khiển phương thức add:

public override void ViewWillLayoutSubviews() 
{ 
    base.ViewWillLayoutSubviews(); 
    this.View.Superview.Bounds = new RectangleF (0, 0, 900, 700); 
} 

Điều quan trọng là để thiết lập chiều rộng mong muốn và chiều cao nếu bạn không muốn ios gán kích thước trang biểu mẫu mặc định

Cập nhật: Trong ios 8 ít nhất có một số trường hợp khi giải pháp trên kích hoạt vòng lặp infinte. Dường như trong một số tình huống (như khi có một webview nhúng trong chế độ xem phương thức và khai thác trong một số văn bản đầu vào html), việc thay đổi giới hạn giám sát sẽ kích hoạt bố trí trên giao diện phương thức dẫn đến một vòng lặp vô hạn và đóng băng ứng dụng. Nhưng trong ios 8 bạn chỉ có thể thiết lập thuộc tính PrefferedSize để đạt được hiệu quả tương tự.

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