Какой элемент управления использовать для захвата изображения с камеры и отображения на экране в виде миниатюры с событиями xamarin ios - PullRequest
1 голос
/ 26 июня 2019

Я создал такое представление в своем мобильном проекте xamarin для iOS.Job Images View

Пользователь сможет нажать на кнопку захвата изображений, чтобы сделать снимок и установить свойство изображения для просмотра изображения.Я хотел бы знать, как я могу позволить пользователю длительное нажатие на изображение (после того, как оно было захвачено) и всплывающее окно сообщения, чтобы удалить изображение.

Я попробовал то, что Самир предложил в своем комментарии, примерно так в моем ViewDidLoad

    var gestureRecognizer = new UILongPressGestureRecognizer();
    gestureRecognizer.AddTarget(() => ButtonLongPressed(gestureRecognizer));
    img1.AddGestureRecognizer(gestureRecognizer);
    img2.AddGestureRecognizer(gestureRecognizer);

Когда я нажимаю и удерживаю изображение, ничего не происходит.Я добавил эти изображения через дизайнер.

После небольшого исследования и использования комментария @Junior Jiang - MSFT.Я немного продвинулся, но я хотел бы знать, какой вид UIImage был нажат.

Вот мой текущий код:

 public JobImagesViewController(Job passedInCurrentJob) : base("JobImagesViewController", null)
        {
            currentJob = passedInCurrentJob;
            uIImageViews = new List<UIImageView>();           
        }

    public override void ViewDidLoad()
        {
            base.ViewDidLoad();

            uIImageViews.Add(img1);
            uIImageViews.Add(img2);
            uIImageViews.Add(img3);
            uIImageViews.Add(img4);
            uIImageViews.Add(img5);
            uIImageViews.Add(img6);
            uIImageViews.Add(img7);
            uIImageViews.Add(img8);
            uIImageViews.Add(img9);
            uIImageViews.Add(img10);

            InitialiseImageGrid();

            // Add a Save button to the navigation bar
            this.NavigationItem.SetRightBarButtonItem(
                new UIBarButtonItem("Save", UIBarButtonItemStyle.Done, (sender, args) =>
                {
                    //TODO if else block with all logic to check if there are images etc.
                    //TODO prompt user and ask if they would like to save images.
                    UIAlertView alert = new UIAlertView("Save Images?", "Save images against the Job?", null, "Yes", new string[] { "No" });
                    alert.Clicked += (s, e) =>
                    {
                        if (e.ButtonIndex == 0) // Yes clicked
                        {
                            SaveJobImages();
                        }
                    };
                    alert.Show();

                }), true);

        }


   [Export("ImageLongPressed:")]
        public void ImageLongPressed(UILongPressGestureRecognizer gestureRecognizer)
        {
            if (gestureRecognizer.State != UIGestureRecognizerState.Began)
            {
                return;
                // Needed because selector is executed twice, because Long-press gestures are continuous
            }
            // Perform action of opening the dialog to select/take a picture, replacing the ? image with the new image
            UIAlertView alert = new UIAlertView("Delete this image ?" , "Are you sure you want to delete this image?", null, "Yes", new string[] { "No" });
            alert.Clicked += (s, e) =>
            {
                if (e.ButtonIndex == 0) // 'Accept' clicked
                {
                    // TODO how to get the image which has been clicked??
                }
            };
            alert.Show();

        }


        private void InitialiseImageGrid()
        {
            _imageList = DataAccess.GetImages(currentJob.jobAddressID);
            var imageBytes = _imageList.Select(x => x.ImageBytes).ToList();

            var gestureRecognizer = new UILongPressGestureRecognizer(this, new ObjCRuntime.Selector("ImageLongPressed:"));
            gestureRecognizer.AddTarget(() => ImageLongPressed(gestureRecognizer));

            // Populate the image views.
            // TODO need to find a way to assign it to every imageview on the view without looping maybe linq???
            int i = 0;
            foreach (var item in imageBytes)
            {
                var imagedata = NSData.FromArray(item);
                var img = UIImage.LoadFromData(imagedata);

                if (uIImageViews != null && uIImageViews.Count > i)
                {
                    uIImageViews[i].UserInteractionEnabled = true;
                    uIImageViews[i].AddGestureRecognizer(gestureRecognizer);
                    uIImageViews[i].AddGestureRecognizer(gestureRecognizer);
                    uIImageViews[i].Image = img;
                }
                i++;

        }

Ответы [ 2 ]

1 голос
/ 26 июня 2019

Это зависит от того, как вы создаете свое представление, используете ли вы XIB со всеми изображениями там в качестве кнопок с изображениями, и IBActions подключен к этим кнопкам.просто сделайте отправителя UILongPressGestureRecognizer.

Если вы делаете это с помощью кода, то в вашем ViewDidLoad вы хотите, чтобы ваши кнопки имели инициал?(или изображение необходимо) фоновое изображение, а затем вы добавляете UILongPress GestureRecognizer к каждому из них.Итак, если бы у вас была одна кнопка, вы бы сделали это:

public override void ViewDidLoad ()
{
    // Perform any additional setup after loading the view

    UIButton button = new UIButton (new System.Drawing.RectangleF(100, 100, 100, 30));
    button.SetBackgroundImage ("imageNeeded", UIControlState.Normal);
    var gestureRecognizer = new UILongPressGestureRecognizer ();
    gestureRecognizer.AddTarget(() => this.ButtonLongPressed(gestureRecognizer));
    button.AddGestureRecognizer(gestureRecognizer);
    this.View.Add (button);
}

public void ButtonLongPressed(UILongPressGestureRecognizer gestureRecognizer)
{
    if (gestureRecognizer.State != UIGestureRecognizerState.Began) 
    {
          return;
          // Needed because selector is executed twice, because Long-press gestures are continuous
    }
    // Perform action of opening the dialog to select/take a picture, replacing the ? image with the new image
}
0 голосов
/ 28 июня 2019

Если вы хотите использовать UILongPressGestureRecognizer в UIImage , следует установить UserInteractionEnabled в ImageView true.

Как следует:

List<UIImageView> imageViews = new List<UIImageView>();

UIImage image = UIImage.FromFile("off.png");
ImageViewOne.Image = image;
ImageViewOne.Tag = 1;
ImageViewTwo.Image = image;
ImageViewTwo.Tag = 2;

imageViews.Add(ImageViewOne);
imageViews.Add(ImageViewTwo);

foreach (var imageview in imageViews)
{
    imageview.UserInteractionEnabled = true;
    UILongPressGestureRecognizer uITapGestureRecognizer = new UILongPressGestureRecognizer();
    uITapGestureRecognizer.AddTarget(() => { Console.WriteLine("You choose View " + imageview.Tag); });
    imageview.AddGestureRecognizer(uITapGestureRecognizer);
}

Вот официальный документ от Apple.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...