Added reflection service to handle sizerequest for extendedtableview. Remove footer spacing on uitableview ios renderer.

This commit is contained in:
Kyle Spearrin 2016-07-03 02:57:09 -04:00
parent ec419a2306
commit b9c823b0aa
12 changed files with 121 additions and 3 deletions

View File

@ -259,6 +259,7 @@
<Compile Include="Services\KeyStoreStorageService.cs" />
<Compile Include="MainActivity.cs" />
<Compile Include="Properties\AssemblyInfo.cs" />
<Compile Include="Services\ReflectionService.cs" />
<Compile Include="Services\SqlService.cs" />
</ItemGroup>
<ItemGroup>

View File

@ -122,6 +122,7 @@ namespace Bit.Android
.RegisterType<IPushNotificationListener, PushNotificationListener>(new ContainerControlledLifetimeManager())
.RegisterType<IAppIdService, AppIdService>(new ContainerControlledLifetimeManager())
.RegisterType<IPasswordGenerationService, PasswordGenerationService>(new ContainerControlledLifetimeManager())
.RegisterType<IReflectionService, ReflectionService>(new ContainerControlledLifetimeManager())
// Repositories
.RegisterType<IFolderRepository, FolderRepository>(new ContainerControlledLifetimeManager())
.RegisterType<IFolderApiRepository, FolderApiRepository>(new ContainerControlledLifetimeManager())

View File

@ -0,0 +1,34 @@
using System;
using System.Reflection;
using Bit.App.Abstractions;
using Bit.App.Controls;
using Xamarin.Forms;
namespace Bit.Android.Services
{
public class ReflectionService : IReflectionService
{
public Func<double, double, SizeRequest> GetVisualElementOnSizeRequest(ExtendedTableView tableView)
{
var handle = typeof(VisualElement).GetMethod(
"OnSizeRequest",
BindingFlags.Instance | BindingFlags.NonPublic,
null,
new Type[] { typeof(double), typeof(double) },
null)?.MethodHandle;
if(!handle.HasValue)
{
throw new ArgumentNullException("handle could not be found.");
}
var pointer = handle.Value.GetFunctionPointer();
if(pointer == null)
{
throw new ArgumentNullException("pointer could not be found.");
}
return (Func<double, double, SizeRequest>)Activator.CreateInstance(typeof(Func<double, double, SizeRequest>), tableView, pointer);
}
}
}

View File

@ -0,0 +1,11 @@
using System;
using Bit.App.Controls;
using Xamarin.Forms;
namespace Bit.App.Abstractions
{
public interface IReflectionService
{
Func<double, double, SizeRequest> GetVisualElementOnSizeRequest(ExtendedTableView tableView);
}
}

View File

@ -40,6 +40,7 @@
<Compile Include="Abstractions\Services\IAppIdService.cs" />
<Compile Include="Abstractions\Services\IAuthService.cs" />
<Compile Include="Abstractions\Services\IClipboardService.cs" />
<Compile Include="Abstractions\Services\IReflectionService.cs" />
<Compile Include="Abstractions\Services\ISiteService.cs" />
<Compile Include="Abstractions\Services\IFolderService.cs" />
<Compile Include="App.cs" />

View File

@ -1,10 +1,21 @@
using System;
using Xamarin.Forms;
using System.Reflection;
using System.Reflection.Emit;
using System.Runtime.InteropServices;
using XLabs.Ioc;
using Bit.App.Abstractions;
namespace Bit.App.Controls
{
public class ExtendedTableView : TableView
{
public ExtendedTableView()
: base()
{
VerticalOptions = LayoutOptions.Start;
}
public static readonly BindableProperty EnableScrollingProperty =
BindableProperty.Create(nameof(EnableScrolling), typeof(bool), typeof(ExtendedTableView), true);
@ -33,5 +44,17 @@ namespace Bit.App.Controls
}
public int EstimatedRowHeight { get; set; }
protected override SizeRequest OnSizeRequest(double widthConstraint, double heightConstraint)
{
if(Device.OS == TargetPlatform.iOS && VerticalOptions.Alignment != LayoutAlignment.Fill)
{
var reflectionService = Resolver.Resolve<IReflectionService>();
var baseBaseOnSizeRequest = reflectionService.GetVisualElementOnSizeRequest(this);
return baseBaseOnSizeRequest(widthConstraint, heightConstraint);
}
return base.OnSizeRequest(widthConstraint, heightConstraint);
}
}
}

View File

@ -47,6 +47,9 @@ namespace Bit.App.Pages
EnableScrolling = false,
EnableSelection = false,
HasUnevenRows = true,
VerticalOptions = LayoutOptions.Start,
BackgroundColor = Color.Gray,
Margin = new Thickness(0, -1),
Root = new TableRoot
{
new TableSection()
@ -67,6 +70,9 @@ namespace Bit.App.Pages
Intent = TableIntent.Settings,
EnableScrolling = false,
EnableSelection = true,
VerticalOptions = LayoutOptions.End,
BackgroundColor = Color.Yellow,
Margin = new Thickness(0, -1),
Root = new TableRoot
{
new TableSection()
@ -102,7 +108,7 @@ namespace Bit.App.Pages
}, ToolbarItemOrder.Default, 0);
Title = "Edit Folder";
Content = new StackLayout { Children = { mainTable, deleteTable } };
Content = new ScrollView { Content = new StackLayout { Children = { mainTable, deleteTable } } };
ToolbarItems.Add(saveToolBarItem);
if(Device.OS == TargetPlatform.iOS)
{

View File

@ -39,7 +39,8 @@ namespace Bit.App.Pages
Margin = new Thickness(15, 40, 15, 0),
HorizontalTextAlignment = TextAlignment.Center,
FontFamily = "Courier",
LineBreakMode = LineBreakMode.TailTruncation
LineBreakMode = LineBreakMode.TailTruncation,
VerticalOptions = LayoutOptions.Start
};
var tgr = new TapGestureRecognizer();
@ -64,6 +65,7 @@ namespace Bit.App.Pages
EnableScrolling = false,
Intent = TableIntent.Menu,
HasUnevenRows = true,
VerticalOptions = LayoutOptions.End,
Root = new TableRoot
{
new TableSection

View File

@ -200,6 +200,7 @@ namespace Bit.iOS
.RegisterType<IPushNotificationListener, PushNotificationListener>(new ContainerControlledLifetimeManager())
.RegisterType<IAppIdService, AppIdService>(new ContainerControlledLifetimeManager())
.RegisterType<IPasswordGenerationService, PasswordGenerationService>(new ContainerControlledLifetimeManager())
.RegisterType<IReflectionService, ReflectionService>(new ContainerControlledLifetimeManager())
// Repositories
.RegisterType<IFolderRepository, FolderRepository>(new ContainerControlledLifetimeManager())
.RegisterType<IFolderApiRepository, FolderApiRepository>(new ContainerControlledLifetimeManager())

View File

@ -23,9 +23,12 @@ namespace Bit.iOS.Controls
UpdateRowHeight(view);
UpdateEstimatedRowHeight(view);
UpdateSeparatorColor(view);
Control.SectionFooterHeight = 0.01f;
Control.EstimatedSectionFooterHeight = 1f;
Control.ContentInset = new UIEdgeInsets(0, 0, -35, 0);
}
}
protected override void OnElementPropertyChanged(object sender, PropertyChangedEventArgs e)
{
base.OnElementPropertyChanged(sender, e);

View File

@ -0,0 +1,34 @@
using System;
using System.Reflection;
using Bit.App.Abstractions;
using Bit.App.Controls;
using Xamarin.Forms;
namespace Bit.iOS.Services
{
public class ReflectionService : IReflectionService
{
public Func<double, double, SizeRequest> GetVisualElementOnSizeRequest(ExtendedTableView tableView)
{
var handle = typeof(VisualElement).GetMethod(
"OnSizeRequest",
BindingFlags.Instance | BindingFlags.NonPublic,
null,
new Type[] { typeof(double), typeof(double) },
null)?.MethodHandle;
if(!handle.HasValue)
{
throw new ArgumentNullException("handle could not be found.");
}
var pointer = handle.Value.GetFunctionPointer();
if(pointer == null)
{
throw new ArgumentNullException("pointer could not be found.");
}
return (Func<double, double, SizeRequest>)Activator.CreateInstance(typeof(Func<double, double, SizeRequest>), tableView, pointer);
}
}
}

View File

@ -115,6 +115,7 @@
<Compile Include="Services\ClipboardService.cs" />
<Compile Include="Main.cs" />
<Compile Include="AppDelegate.cs" />
<Compile Include="Services\ReflectionService.cs" />
<None Include="Entitlements.plist" />
<None Include="Info.plist" />
<Compile Include="Properties\AssemblyInfo.cs" />