Настройка UIAlertView

Для вашей проблемы я попробовал две реализации в зависимости от того, что вы хотите, в обоих решениях, которые, как я предполагал, вам абсолютно необходимо, чтобы ваш остаток был равен 0. В противном случае алгоритм вернет вас -1. Если они вам нужны, скажите мне, что я могу адаптировать свой алгоритм.

Поскольку алгоритм реализован с помощью динамического программирования, он обрабатывает хорошие входные данные, по крайней мере, более 130 пакетов!

В первом решении я признал, что каждый раз мы заполняем самый большой пакет. Во втором решении я стараюсь минимизировать цену, но количество пакетов всегда должно быть равно 0.

remaining_order = 13
package_numbers = sorted([9,5,3], reverse=True) # To make sure the biggest package is the first element
prices = {9: 16, 5: 9, 3: 5}
required_packages = []

# First solution, using the biggest package each time, and making the total order remaining at 0 each time
ans = [[] for _ in range(remaining_order + 1)]
ans[0] = [0, 0, 0]
for i in range(1, remaining_order + 1):
    for index, package_number in enumerate(package_numbers):
        if i-package_number > -1:
            tmp = ans[i-package_number]
            if tmp != -1:
                ans[i] = [tmp[x] if x != index else tmp[x] + 1 for x in range(len(tmp))]
                break
    else: # Using for else instead of a boolean value `found`
        ans[i] = -1 # -1 is the not found combinations

print(ans[13]) # [0, 2, 1]
print(ans[9]) # [1, 0, 0]

# Second solution, minimizing the price with order at 0

def price(x):
    return 16*x[0]+9*x[1]+5*x[2]

ans = [[] for _ in range(remaining_order + 1)]
ans[0] = ([0, 0, 0],0) # combination + price
for i in range(1, remaining_order + 1):
    # The not found packages will be (-1, float('inf'))
    minimal_price = float('inf')
    minimal_combinations = -1
    for index, package_number in enumerate(package_numbers):
        if i-package_number > -1:
            tmp = ans[i-package_number]
            if tmp != (-1, float('inf')):
                tmp_price = price(tmp[0]) + prices[package_number] 
                if tmp_price < minimal_price:
                    minimal_price = tmp_price
                    minimal_combinations = [tmp[0][x] if x != index else tmp[0][x] + 1 for x in range(len(tmp[0]))]
    ans[i] = (minimal_combinations, minimal_price)

print(ans[13]) # ([0, 2, 1], 23)
print(ans[9]) # ([0, 0, 3], 15) Because the price of three packages is lower than the price of a package of 9
8
задан Glorfindel 2 March 2019 в 08:01
поделиться

4 ответа

Я думаю, что Ваш лучший выбор состоит в том, чтобы забыть настраивать представление UIAlert и создать пользовательское представление самостоятельно.

Для одного то, что Вы показываете действительно, не является "предупреждением", таким образом, это в противоречии с тем, для чего UIAlertView разработан, чтобы быть. Это означает изменение парадигмы UI на пользователе, который никогда не является хорошей идеей.

Во-вторых, было бы намного легче анимировать пользовательское представление в место, чем попытаться взломать UIAlertView, чтобы заставить это делать то, что Вы хотите.

27
ответ дан 5 December 2019 в 04:32
поделиться

Нет никаких встроенных компонентов для этого. UIAlertView должен просто иметь текст и кнопки согласно документу HIG.

Необходимо будет создать собственное представление и добавить средства управления к нему. Пример HeadsUpUI в SDK показывает, как показать подобное пользовательскому меню представление наложением.

Надежда, которая помогает.

4
ответ дан 5 December 2019 в 04:32
поделиться

Сначала вам нужно увеличить окно предупреждения, чтобы в нем разместились элементы управления, но при этом его нужно разместить в центре.

Для этого вместо настройки размер кадра, текст вашего сообщения с символом "\ n" не обязательно. например:

alert = [[UIAlertView alloc] initWithTitle:@"Rate this picture."
message:@"Tap a star to rate.\n\n\n\n " /*------ look at here!!----*/
delegate:self
cancelButtonTitle:nil
otherButtonTitles:nil];

Затем используйте UIAlertViewDelegate для предупреждения.

переопределите его, viewWillAppear: добавьте кнопки и вручную установите их рамки в желаемое положение.

ИЛИ: создайте полное представление с помощью контроллера представления и добавьте представление в окно предупреждения, например:

[myalertview addSubvew:mycomplexalert];

Надеюсь, это поможет вам :)

Я использую окна предупреждений для ввода рейтинга с изображениями звездочек, твиттером, обратной связью в ФБ и т. д.

ОБНОВЛЕНИЕ iOS7:

Для iOS 7 создайте собственное представление с компонентами и установите его в качестве дополнительного представления для предупреждения:

[alert setValue:imageView forKey:@"accessoryView"]; 

Это просто: -)

11
ответ дан 5 December 2019 в 04:32
поделиться

В этом руководстве рассказывается, как для создания подкласса UIAlertView для создания текстового поля ввода. В нем объясняется, как увеличить представление, добавить подвиды (например, текстовые поля или изображения) и выполнить преобразование, чтобы переместить поле вверх на экране.

6
ответ дан 5 December 2019 в 04:32
поделиться
Другие вопросы по тегам:

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