Как использовать архитектуру MVP с UITabBarController

Я исправил некоторые из ваших ошибок (в основном неправильные размеры). Но он по-прежнему падает на b16bpp.Save(), потому что GDI + не поддерживает сохранение 16-битных изображений в оттенках серого .

Bitmap b16bpp;
private void GenerateDummy16bitImage()
{

    b16bpp = new Bitmap(IMAGE_WIDTH, IMAGE_HEIGHT, System.Drawing.Imaging.PixelFormat.Format16bppGrayScale);

    var rect = new Rectangle(0, 0, IMAGE_WIDTH, IMAGE_HEIGHT);
    var bitmapData = b16bpp.LockBits(rect, ImageLockMode.WriteOnly, b16bpp.PixelFormat);
    // Calculate the number of bytes required and allocate them.
    var numberOfBytes = bitmapData.Stride * IMAGE_HEIGHT;
    var bitmapBytes = new short[IMAGE_WIDTH * IMAGE_HEIGHT];
    // Fill the bitmap bytes with random data.
    var random = new Random();
    for (int x = 0; x < IMAGE_WIDTH; x++)
    {
        for (int y = 0; y < IMAGE_HEIGHT; y++)
        {

            var i = ((y * IMAGE_WIDTH) + x); // 16bpp

            // Generate the next random pixel color value.
            var value = (short)random.Next(5);

            bitmapBytes[i] = value;         // GRAY
        }
    }
    // Copy the randomized bits to the bitmap pointer.
    var ptr = bitmapData.Scan0;
    Marshal.Copy(bitmapBytes, 0, ptr, bitmapBytes.Length);

    // Unlock the bitmap, we're all done.
    b16bpp.UnlockBits(bitmapData);

    b16bpp.Save("random.bmp", ImageFormat.Bmp);
    Debug.WriteLine("saved");
}

Объяснение моих изменений:

  • bitmapData.Stride уже IMAGE_WIDTH * BytesPerPixel, поэтому вам не нужно умножать на 2
  • , как вы объявили bitmapBytes как short[], он должен иметь размер изображения в пикселях, не входящих в байты
  • , что означает, что вам также не нужно умножать i на 2
  • , так как у вас есть изображение в градациях серого, у него нет синего, зеленого и красного каналов, но один 16-битный серый канал
  • Marshal.Copy занимает длину в «единицах массива» не в байтах

Всего вы пытались скопировать массив 8 раз в большую в растровое изображение.

1
задан Harry Blue 16 January 2019 в 13:49
поделиться

1 ответ

Трудно ответить, не увидев больше кода, однако я считаю, что в MVP вы должны сконфигурировать свои контроллеры представления, используя Configurator.

class FavouritesConfigurator {

    func configureViewController(delegate: FavouritesSceneDelegate?) -> FavouritesViewController {
        let viewController = FavouritesViewController()
        let presenter = FavouritesPresenter(view: viewController)
        presenter.delegate = delegate
        viewController.setPresenter(presenter)
        return viewController
    }
}

Ваш метод запуска координатора должен просто вызвать FavouritesConfigurator и вернуть ViewController, настроенный вашим докладчиком и т. Д.

Вы можете использовать возвращаемое значение этого FavouritesConfigurator для настройки ваших просмотров.

Это просто случай удаления каждой конфигурации представлений от метода запуска и непосредственного вызова этого конфигуратора. Это не нарушает никаких принципов, поскольку ваши компоненты по-прежнему изолированы, проверяемы и вызываются правильно.

Опять же, не видя ваш код, трудно быть точным, но попробуйте это:

let controllers = [FavouritesConfigurator().configureViewController(delegate: self),...,...]
tabBarController.viewControllers = controllers
0
ответ дан nodediggity 16 January 2019 в 13:49
поделиться
Другие вопросы по тегам:

Похожие вопросы: