Понятия не имею о том, почему вы должны Customize navigation bar for QLPreviewController
в своем коде. Я удалил его, и он отлично работает.
Я бы дал вам два способа избавиться от нежелательного сока:
1. Удалить код:
//UINavigationBar.AppearanceWhenContainedIn(typeof(QLPreviewController)).SetBackgroundImage(image, UIBarMetrics.Default);
2.Если вам действительно нужен код для настройки панели навигации, добавьте эту строку кода перед PresentViewController
:
//Add this line before PresentViewController
UINavigationBar.AppearanceWhenContainedIn(typeof(QLPreviewController)).SetBackgroundImage(null, UIBarMetrics.Default);
PresentViewController(previewController, true, completionHandler: null);
Обновление:
Потратил весь день и нашел только решение, не столь идеальное. Во-первых, я хотел бы сказать, что navigationBar
вашего viewController
и navigationBar
из QLPreviewController
- это два разных бара.
Чтобы установить цвет панели навигации, вы можете просто установить его в AppDelegate
, это повлияет на весь navigationBar
цвет в вашем проекте .:
public override bool FinishedLaunching(UIApplication application, NSDictionary launchOptions)
{
// Override point for customization after application launch.
// If not required for your application you can safely delete this method
UINavigationBar.Appearance.BarTintColor = UIColor.FromRGBA(red: 255, green: 0, blue: 0, alpha: 1.0f);
UINavigationBar.Appearance.BarStyle = UIBarStyle.BlackOpaque;
UINavigationBar.Appearance.TintColor = UIColor.White;
return true;
}
Чтобы изменить navigationbarColor
из QLPreviewControl
, вы можете использовать код в функции test
:
public partial class ViewController : UIViewController
{
QLPreviewController previewController;
public ViewController(IntPtr handle) : base(handle)
{
}
public override void ViewDidLoad()
{
base.ViewDidLoad();
this.AutomaticallyAdjustsScrollViewInsets = false;
this.ExtendedLayoutIncludesOpaqueBars = false;
this.EdgesForExtendedLayout = UIRectEdge.None;
string path = NSBundle.MainBundle.PathForResource("myPdf.pdf","");
var reportName = "Report name";
previewController = new QLPreviewController();
var url = new NSUrl(path, true);
var _dataSource = new PreviewControllerSource(this, url, reportName);
previewController.DataSource = _dataSource;
this.NavigationController.PresentViewController(previewController, true, test);
}
public void test() {
var firstChild = previewController.ChildViewControllers[0];
if (firstChild is UINavigationController)
{
var naviVc = firstChild as UINavigationController;
naviVc.NavigationBar.BarTintColor = UIColor.Red ;
}
}
}
Единственное, что не так идеально, - это то, что функция test
будет вызываться до завершения представления, поэтому через некоторое время вы увидите цвет по умолчанию навигационной панели, а затем он изменится на нужный вам.
Если вы используете push-действие вместо модального, вы можете вызвать test
функцию внутри WillShowViewController(UINavigationController navigationController, [Transient] UIViewController viewController, bool animated)
:
public class naviDeleagte : UINavigationControllerDelegate {
public override void WillShowViewController(UINavigationController navigationController, [Transient] UIViewController viewController, bool animated)
{
//call test here if you use a push instead of modal
}
}
Я загрузил свой образец здесь, и вы можете проверить его: navigationBar-color-xamarin.forms