- iOS/Objective-C 元类和类别
- objective-c - -1001 错误,当 NSURLSession 通过 httpproxy 和/etc/hosts
- java - 使用网络类获取 url 地址
- ios - 推送通知中不播放声音
tl;dr:如何在 Xamarin Forms 中像 iOS 邮件应用一样使用滑动来显示按钮
我正在尝试为类似于 iOS 邮件应用程序或此 https://components.xamarin.com/view/swtableviewcell 的 UI 的 Xamarin Forms iOS 应用程序实现滑动以显示按钮 .在我发现的许多其他示例中,该组件非常适合 iOS native 实现,但我需要通过 Xamarin 表单显示此 UI。
目前我有一个像这样的自定义滑动手势识别器:
[assembly: ExportRenderer(typeof(SwipeViewCell), typeof(SwipeIosRenderer))]
namespace MyApp.iOS.Renderers
{
public class SwipeIosRenderer : ViewCellRenderer
{
UISwipeGestureRecognizer swipeRightGestureRecognizer;
UISwipeGestureRecognizer swipeLeftGestureRecognizer;
protected override void OnElementChanged(ElementChangedEventArgs<Label> e)
{
base.OnElementChanged(e);
swipeRightGestureRecognizer = new UISwipeGestureRecognizer(() => UpdateRight()) { Direction = UISwipeGestureRecognizerDirection.Right };
swipeLeftGestureRecognizer = new UISwipeGestureRecognizer(() => UpdateLeft()) { Direction = UISwipeGestureRecognizerDirection.Left };
if (e.NewElement == null)
{
if (swipeRightGestureRecognizer != null)
{
this.RemoveGestureRecognizer(swipeRightGestureRecognizer);
}
if (swipeLeftGestureRecognizer != null)
{
this.RemoveGestureRecognizer(swipeLeftGestureRecognizer);
}
}
if (e.OldElement == null)
{
this.AddGestureRecognizer(swipeRightGestureRecognizer);
this.AddGestureRecognizer(swipeLeftGestureRecognizer);
}
}
private void UpdateLeft()
{
Console.WriteLine("Left swipe");
}
private void UpdateRight()
{
Console.WriteLine("Right swipe");
}
}
绑定(bind)到列表中的视单元。现在我可以识别“滑动”手势,我需要帮助来了解如何实际移动 View 单元格并显示一个按钮,就像我上面给出的示例一样?
如果能够在 XAML View 中执行此操作会很棒,但我对任何事情都持开放态度。我有一个 UpdateLeft 和 UpdateRight 函数,如果可以使用的话,它们也会在相应的滑动 Action 上被调用吗?
**编辑:我需要对左右滑动都执行此操作。 ContextActions 仅提供向左滑动功能。
希望这是有道理的!
最佳答案
会 Context Actions为你工作?我没有在其他平台上尝试过,但在 iOS 上它会创建一个滑动菜单,就像邮件应用程序一样。您应该能够使用 XAML 并绑定(bind)到命令属性。
编辑:由于您阐明了您需要 ContextActions 中不存在的左侧和右侧滑动按钮,因此您可以利用已经具有所需行为的现有 SWTableViewCell 组件并将其调整为 Xamarin.Forms。
iOSRenderer:
public class SwipeIosRenderer : TextCellRenderer
{
static NSString rid = new NSString("SWTableViewCell");
public override UITableViewCell GetCell(Cell item, UITableViewCell reusableCell, UITableView tv)
{
var forms_cell = (SwipeCell)item;
SWTableViewCell native_cell = reusableCell as SWTableViewCell;
if (native_cell == null)
{
native_cell = new SWTableViewCell(UITableViewCellStyle.Default, rid);
if (forms_cell != null)
{
var cellDelegate = new CellDelegate(forms_cell);
native_cell.Delegate = cellDelegate;
if (forms_cell.LeftContextActions != null)
{
var left = new NSMutableArray();
foreach (var btn in forms_cell.LeftContextActions)
{
AddButton(left, btn);
}
native_cell.LeftUtilityButtons = NSArray.FromArray<UIButton>(left);
}
if (forms_cell.RightContextActions != null)
{
var right = new NSMutableArray();
foreach (var btn in forms_cell.RightContextActions)
{
AddButton(right, btn);
}
native_cell.RightUtilityButtons = NSArray.FromArray<UIButton>(right);
}
}
native_cell.TextLabel.Text = forms_cell.Text;
}
var fs = forms_cell.ImageSource as FileImageSource;
if (fs != null)
{
native_cell.ImageView.Image = UIImage.FromBundle(fs.File);
}
return native_cell;
}
void AddButton(NSMutableArray array,Button btn){
if (!String.IsNullOrEmpty(btn.Image?.File))
{
array.AddUtilityButton(btn.BorderColor.ToUIColor(), UIImage.FromBundle(btn.Image.File));
}
else
{
array.AddUtilityButton(btn.BorderColor.ToUIColor(), btn.Text);
}
}
public class CellDelegate : SWTableViewCellDelegate
{
SwipeCell forms_cell;
public CellDelegate(SwipeCell forms_cell)
{
this.forms_cell = forms_cell;
}
public override void DidTriggerLeftUtilityButton(SWTableViewCell cell, nint index)
{
if (forms_cell.LeftContextActions.Count > index)
{
var c = forms_cell.LeftContextActions[(int)index];
var cmd = c.Command;
if (cmd != null)
{
cmd.Execute(c.CommandParameter);
}
}
}
public override void DidTriggerRightUtilityButton(SWTableViewCell cell, nint index)
{
if (forms_cell.RightContextActions.Count > index)
{
var c = forms_cell.RightContextActions[(int)index];
var cmd = c.Command;
if (cmd != null)
{
cmd.Execute(c.CommandParameter);
}
}
}
}
示例 XAML:
<ListView x:Name="SwipeList">
<ListView.ItemTemplate>
<DataTemplate>
<test:SwipeCell Text="{Binding Data}" ImageSource="{Binding Image}">
<test:SwipeViewCell.LeftContextActions>
<Button Text="L1" Command="{Binding LeftAction}" BorderColor="Aqua"/>
<Button Command="{Binding LeftAction2}" BorderColor="Gray" Image="xamarin.png"/>
</test:SwipeViewCell.LeftContextActions>
<test:SwipeViewCell.RightContextActions>
<Button Text="R1" Command="{Binding RightAction}" BorderColor="Blue" />
<Button Text="R2" Command="{Binding RightAction2}" BorderColor="Purple" />
</test:SwipeViewCell.RightContextActions>
</test:SwipeViewCell>
</DataTemplate>
</ListView.ItemTemplate>
</ListView>
示例代码隐藏
public class MyListItem
{
Page page;
public MyListItem(Page page)
{
this.page = page;
this.LeftAction= new Command(() => this.page.DisplayAlert("Left 1", this.Data, "OK"));
this.LeftAction2= new Command(() => this.page.DisplayAlert("Left 2", this.Data, "OK"));
this.RightAction= new Command(() => this.page.DisplayAlert("Right 1", this.Data, "OK"));
this.RightAction2= new Command(() => this.page.DisplayAlert("Right 2", this.Data, "OK"));
}
public string Image{ get; set; }
string data;
public string Data
{
get
{
return data;
}
set
{
data = value;
}
}
ICommand leftAction;
public ICommand LeftAction
{
get
{
return leftAction;
}
set
{
leftAction = value;
}
}
ICommand leftAction2;
public ICommand LeftAction2
{
get
{
return leftAction2;
}
set
{
leftAction2 = value;
}
}
ICommand rightAction;
public ICommand RightAction
{
get
{
return rightAction;
}
set
{
rightAction = value;
}
}
ICommand rightAction2;
public ICommand RightAction2
{
get
{
return rightAction2;
}
set
{
rightAction2 = value;
}
}
public override string ToString()
{
return this.Data;
}
}
public TestPage()
{
InitializeComponent();
this.SwipeList.ItemsSource = new List<MyListItem>(){
new MyListItem(this){Data="A"},
new MyListItem(this){Data="B", Image="xamarin.png"},
new MyListItem(this){Data="C"},
new MyListItem(this){Data="D"},
};
}
关于ios - Xamarin 形成 ViewCell 滑动以显示按钮,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/36560520/
我已经从github https://github.com/xamarin/xamarin-forms-samples下载了Xamarin.Form示例项目 打开任何示例项目后,它不允许我在iOS S
我收到此错误: "MyApp\App.cs(7,7): Error CS0246: The type or namespace name 'Xamarin' could not be found (a
我想知道 Xamarin 是否带有 Mono 运行时及其所有应用程序包。在这种情况下,如果两个基于 Xamarin 的应用程序安装在一个设备上,该设备将拥有两个 Mono 运行时权利。这是 Xamar
如何将库导入 Xamarin? 例如,我将如何导入 json.net为我的项目使用 xamarin? 谢谢 最佳答案 Json.NET可免费获得精美包装 Xamarin-compatible Comp
我不知道如何在输入框中置顶占位符文本。 我有一个很大的输入框,想把占位符文本放在顶部。 最佳答案 您需要为每个平台创建一个自定义渲染器以对齐占位符,如下所示: public class Placeh
我很难找到有关Xamarin.Forms的后台任务支持的文档。 Xamarin.Forms是否提供对定期后台任务的支持? 我需要为Windows Phone 10和Android都实现此功能。 最佳答
Xamarin.iOS中是否提供iOS Picker?我进行了详尽的搜索,但是没有示例,也没有信息可查。但是,它在Xamarin.Form中可用。 最佳答案 UIPickerView的真实示例示例:(
有谁知道是否可以使用 Xamarin.Forms 创建CardView样式(可滚动)列表?我们需要它在iOS和Android上将呈现为相同的。还需要调整阴影等属性(略微提高每张卡) 最佳答案 这是一个
所以,我对 Xamarin 有点陌生,我试图弄清楚如何显示一个包含用户文本输入字段的弹出窗口。 DisplayAlert 不这样做,因为它没有文本输入字段。我应该使用什么? 最佳答案 您可以使用 Di
我有一个运行良好的表单应用程序,但我注意到当页面出现时,背景颜色在几分之一秒内设置不正确。 我有这个代码用于我的 OnAppearing protected override async vo
您好,我正在开发一个具有登录功能的应用程序,它可以选择让您保持登录状态,即使您关闭该应用程序也是如此。 问题是什么?这就是我在 App.cs 中所做的: var statusLog = Appli
由于BackgroundImage是一个字符串,您应该如何设置Page的背景图像?我将不胜感激任何建议。 到目前为止,我已经尝试过: MainPage = new ContentPage {
如何使用 Renderer 在 Xamarin Forms 中使用渐变效果创建此按钮? 最佳答案 在 xamarin 中,您不能将渐变颜色添加为内置功能。您必须创建不同的渲染功能。这个 link 将指
背景:我正在处理一个 C# 项目。过去,当我做 System.Console.WriteLine("Hello"); 我会看到一个弹出控制台打印“你好”。控制台今天消失了,我该怎么做才能让它再次出现?
我们每天都在使用 Xamarin 和 Xamarin Forms,并且经常遇到异常而没有任何关于如何调试的有用信息。 有时它是我们的目标,有时是 Xamarin 中的错误,尤其是 Xamarin Fo
我正在使用 xamarin studio(带有 nuget 包管理插件),并且在我的项目中有一些 nuget 包。 项目上下文菜单中有“管理”和“恢复 nuget 包”,但也有控制台吗? 最佳答案 X
我有一个 CustomCalendar 元素,它是通过扩展 ContentView 并在另一个 ContentPage 中使用此自定义 View 而创建的。我尝试使用非聚焦事件来检测外部点击。但是问题
因此,对于整个MVVM,我还是一个新手。我几乎了解它的基本知识。我有一个可以按原样工作的示例,但是我试图将其更改为MVVM样式。我只是尝试不同的例子,所以我可以学习。 (LoginPage.xaml)
我正在尝试使我的Xamarin项目在Prism和DryIoc中使用MVVM。 我主要想使用自动注册,如下所示: [AutoRegisterForNavigation] ... protected ov
我有一个问题,如何在 Forms Xamarin 中制作模态屏幕,如附加的图像。 我想知道你们是否可以向我发送一段代码或示例以了解如何做到这一点。 https://extravios.com.br/c
我是一名优秀的程序员,十分优秀!