public override void DidUpdateFocus (UIFocusUpdateContext context, UIFocusAnimationCoordinator coordinator)
		{
			var nextFocusedView = context.NextFocusedView;

			if (!nextFocusedView.IsDescendantOfView (TableView))
				return;

			NSIndexPath indexPath = ((UITableViewFocusUpdateContext)context).NextFocusedIndexPath;
			if (indexPath == null)
				return;

			// Cancel any previously queued segues.
			delayedSeguesOperationQueue.CancelAllOperations ();

			// Create an `NSBlockOperation` to perform the detail segue after a delay.
			var performSegueOperation = new NSBlockOperation ();
			var segueIdentifier = SegueIdentifierMap[indexPath.Section][indexPath.Row];

			performSegueOperation.AddExecutionBlock (() => {
				NSThread.SleepFor (performSegueDelay);
				if (performSegueOperation.IsCancelled && segueIdentifier == lastPerformedSegueIdentifier)
					return;

				NSOperationQueue.MainQueue.AddOperation (() => {
					PerformSegue (segueIdentifier, nextFocusedView);
					lastPerformedSegueIdentifier = segueIdentifier;
					TableView.SelectRow (indexPath, true, UITableViewScrollPosition.None);
				});
			});

			delayedSeguesOperationQueue.AddOperation (performSegueOperation);
		}
Example #2
0
        public void ComposeCell(DataItemCollectionViewCell cell, DataItem dataItem)
        {
            var operationQueue = OperationQueueForCell(cell);

            operationQueue.CancelAllOperations();

            cell.RepresentedDataItem = dataItem;
            cell.Label.Text          = dataItem.Title;
            cell.ImageView.Alpha     = 1f;
            cell.ImageView.Image     = (UIImage)processedImageCache.ObjectForKey((NSString)dataItem.Identifier);

            if (cell.ImageView.Image != null)
            {
                return;
            }

            var processImageOperation = new NSBlockOperation();

            processImageOperation.AddExecutionBlock(() => {
                if (processImageOperation.IsCancelled)
                {
                    return;
                }

                UIImage image = null;
                DispatchQueue.MainQueue.DispatchSync(() => {
                    image = ProcessImageNamed(dataItem.ImageName);
                });

                if (image == null)
                {
                    return;
                }

                processedImageCache.SetObjectforKey(image, (NSString)dataItem.Identifier);
                NSOperationQueue.MainQueue.AddOperation(() => {
                    if (cell.RepresentedDataItem == null)
                    {
                        return;
                    }

                    cell.ImageView.Alpha = 0f;
                    cell.ImageView.Image = image;
                    UIView.Animate(0.25, () => cell.ImageView.Alpha = 1f);
                });
            });

            operationQueue.AddOperation(processImageOperation);
        }
		public void ComposeCell (DataItemCollectionViewCell cell, DataItem dataItem)
		{
			var operationQueue = OperationQueueForCell (cell);
			operationQueue.CancelAllOperations ();

			cell.RepresentedDataItem = dataItem;
			cell.Label.Text = dataItem.Title;
			cell.ImageView.Alpha = 1f;
			cell.ImageView.Image = (UIImage)processedImageCache.ObjectForKey ((NSString)dataItem.Identifier);

			if (cell.ImageView.Image != null)
				return;

			var processImageOperation = new NSBlockOperation ();
			processImageOperation.AddExecutionBlock (() => {
				if (processImageOperation.IsCancelled)
					return;

				UIImage image = null;
				DispatchQueue.MainQueue.DispatchSync (() => {
					image = ProcessImageNamed (dataItem.ImageName);
				});

				if (image == null)
					return;

				processedImageCache.SetObjectforKey (image, (NSString)dataItem.Identifier);
				NSOperationQueue.MainQueue.AddOperation (() => {
					if (cell.RepresentedDataItem == null)
						return;

					cell.ImageView.Alpha = 0f;
					cell.ImageView.Image = image;
					UIView.Animate (0.25, () => cell.ImageView.Alpha = 1f);
				});
			});

			operationQueue.AddOperation (processImageOperation);
		}
        public override void DidUpdateFocus(UIFocusUpdateContext context, UIFocusAnimationCoordinator coordinator)
        {
            var nextFocusedView = context.NextFocusedView;

            if (!nextFocusedView.IsDescendantOfView(TableView))
            {
                return;
            }

            NSIndexPath indexPath = ((UITableViewFocusUpdateContext)context).NextFocusedIndexPath;

            if (indexPath == null)
            {
                return;
            }

            // Cancel any previously queued segues.
            delayedSeguesOperationQueue.CancelAllOperations();

            // Create an `NSBlockOperation` to perform the detail segue after a delay.
            var performSegueOperation = new NSBlockOperation();
            var segueIdentifier       = SegueIdentifierMap[indexPath.Section][indexPath.Row];

            performSegueOperation.AddExecutionBlock(() => {
                NSThread.SleepFor(performSegueDelay);
                if (performSegueOperation.IsCancelled && segueIdentifier == lastPerformedSegueIdentifier)
                {
                    return;
                }

                NSOperationQueue.MainQueue.AddOperation(() => {
                    PerformSegue(segueIdentifier, nextFocusedView);
                    lastPerformedSegueIdentifier = segueIdentifier;
                    TableView.SelectRow(indexPath, true, UITableViewScrollPosition.None);
                });
            });

            delayedSeguesOperationQueue.AddOperation(performSegueOperation);
        }