Я начал использовать Xamarin, потому что я хотел остаться в среде Visual Studio 2013 и не должен изучать новую среду. В любом случае, я собираюсь вставить свой код контроллера ниже и, надеюсь, кто-то умнее меня (почти наверняка) и может вернуть меня в нужное русло.
Я только что открыл AutoLayout. Мне кажется, что понимание AutoLayout имеет решающее значение для ускорения развития. Тем не менее, я не нахожу много информации для использования AutoLayout с чистым С# в Visual Studio 2013. Возможно, я просто не ищу в нужных местах.
В любом случае, давайте начнем эту новую дискуссию с простого контроллера, который использует AutoLayout TOTALLY на С# без использования каких-либо файлов .nib или Interface Builder. И без использования Xamarin Studio. Просто все сделано в Visual Studio 2013.
Вот требования:
- Создайте UIViewController, который облегчит реализацию apple iAD.
- В принципе, мы хотим разместить баннер iAD в нижней части экрана, занимая всю ширину.
- Мы разместим представление над баннером iAD и заполним оставшуюся часть экрана.
- Просмотр баннера может время от времени исчезать, если AD не присутствует, поэтому нам нужно обработать это.
- Нам нужно обращаться, когда устройство вращается для размещения новой ориентации.
-
Нам нужно обрабатывать разные устройства. iPod, iPad, iPhone, версия 4 и 5
Это должно быть тривиально, но я два дня пробиваю себе голову на клавиатуре, пытаясь заставить это работать. Любые рекомендации, примеры или идеи были бы ВЕЛИКОЙ ПОЛЕЗНОЙ. Помните, мы хотим ТОЛЬКО использовать С# в Visual Studio и вообще не использовать Interface Builder. Вот моя не рабочая попытка:
Используя приведенный ниже код, я заканчиваю тем, что AdBanner отключен от экрана под внутренним представлением. Кроме того, внутренний вид длиннее экрана и только половину ширины экрана. Что здесь происходит? Нужно ли включать функцию AutoLayout? Могу ли я сделать это в коде С# или он скрывается где-то в настройках проекта?
using System;
using MonoTouch.iAd;
using MonoTouch.UIKit;
namespace ADayBDayiOS
{
public class ADViewController : UIViewController
{
private UIView InternalView { get; set; }
private ADBannerView AdView { get; set; }
public override void ViewDidLoad()
{
base.ViewDidLoad();
InternalView = new UIView{BackgroundColor=UIColor.Blue};
//This is apple standard ADBannerView
AdView = new ADBannerView(ADAdType.Banner) {Hidden = true};
AdView.FailedToReceiveAd += HandleFailedToReceiveAd;
AdView.AdLoaded += HandleAdLoaded;
View.BackgroundColor = UIColor.Clear;
//I'm pretty sure that we need these three lines
View.TranslatesAutoresizingMaskIntoConstraints = false;
InternalView.TranslatesAutoresizingMaskIntoConstraints = false;
AdView.TranslatesAutoresizingMaskIntoConstraints = false;
View.AddSubview(InternalView);
View.AddSubview(AdView);
Resize();
}
public override void DidRotate(UIInterfaceOrientation fromInterfaceOrientation)
{
base.DidRotate(fromInterfaceOrientation);
Resize();
}
public override void ViewDidAppear(bool animated)
{
base.ViewDidAppear(animated);
Resize();
}
private void Resize()
{
//Remove all constraints, and reset them...
View.RemoveConstraints(View.Constraints);
if (AdView == null || AdView.Hidden)
{//Fill up the entire screen with our InternalView
View.AddConstraint(NSLayoutConstraint.Create(InternalView, NSLayoutAttribute.Width, NSLayoutRelation.Equal, View, NSLayoutAttribute.Width, 1, 0));
View.AddConstraint(NSLayoutConstraint.Create(InternalView, NSLayoutAttribute.Bottom, NSLayoutRelation.Equal, View, NSLayoutAttribute.Bottom, 1, 0));
View.AddConstraint(NSLayoutConstraint.Create(InternalView, NSLayoutAttribute.Top, NSLayoutRelation.Equal, View, NSLayoutAttribute.Top, 1, 0));
}
else
{//Put banner ad at the bottom of the screen and fill the rest of the screen with our InternalView
View.AddConstraint(NSLayoutConstraint.Create(AdView, NSLayoutAttribute.Width, NSLayoutRelation.Equal, View, NSLayoutAttribute.Width, 1, 0));
View.AddConstraint(NSLayoutConstraint.Create(InternalView, NSLayoutAttribute.Width, NSLayoutRelation.Equal, View, NSLayoutAttribute.Width, 1, 0));
View.AddConstraint(NSLayoutConstraint.Create(AdView, NSLayoutAttribute.Bottom, NSLayoutRelation.Equal, View, NSLayoutAttribute.Bottom, 1, 0));
View.AddConstraint(NSLayoutConstraint.Create(InternalView, NSLayoutAttribute.Bottom, NSLayoutRelation.Equal, View, NSLayoutAttribute.Bottom, 1, AdView.Bounds.Height));
View.AddConstraint(NSLayoutConstraint.Create(InternalView, NSLayoutAttribute.Top, NSLayoutRelation.Equal, View, NSLayoutAttribute.Top, 1, 0));
}
}
/// <summary>
/// Shows the AdView when a new Ad loads
/// </summary>
/// <param name="sender"></param>
/// <param name="e"></param>
void HandleAdLoaded(object sender, EventArgs e)
{
if (AdView == null)
return;
AdView.Hidden = false;
Resize();
}
/// <summary>
/// Hides the AdView when no ads are available
/// </summary>
/// <param name="sender"></param>
/// <param name="e"></param>
void HandleFailedToReceiveAd(object sender, AdErrorEventArgs e)
{
if (AdView == null)
return;
AdView.Hidden = true;
Resize();
}
}
}