UIActionSheet с изображением

Ради бога, кто-нибудь подскажите, как добавить картинку в UIActionSheet.

Я добавляю его, но не могу заставить лист снова растянуться по высоте, поэтому Subview подойдет.

var sheet = new UIActionSheet ("Sheet with a picture");
sheet.AddButton ("Pick New Picture");

var subView = new UIView(new RectangleF(20,100,280,200)){ 
    BackgroundColor = UIColor.FromPatternImage(Picture)};

sheet.AddSubview(subView);
sheet.AddButton ("Cancel");
sheet.CancelButtonIndex = 1;

Я попытался изменить contentMode subView и листа. Не сработало. Что я делаю неправильно? введите описание изображения здесь

Картинка должна помещаться между пуговицами или помещаться на листе каким-либо другим образом.


person iLemming    schedule 22.11.2011    source источник
comment
пробовали ли вы этот метод - stackoverflow.com/questions/1305623/ - используя ImageView?   -  person Jason    schedule 23.11.2011
comment
@Jason добавляет представление изображения, но результат тот же, не растягивает высоту представления   -  person iLemming    schedule 23.11.2011


Ответы (4)


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

var sheet = new UIActionSheet ("");
sheet.AddButton ("Discard Picture");
sheet.AddButton ("Pick New Picture");
sheet.AddButton ("Cancel");
sheet.CancelButtonIndex = 2;

// Dummy buttons to preserve the space for the UIImageView
for (int i = 0; i < 4; i++) {
    sheet.AddButton("");
    sheet.Subviews[i+4].Alpha = 0; // And of course it's better to hide them
}

var subView = new UIImageView(Picture);
subView.ContentMode = UIViewContentMode.ScaleAspectFill;
subView.Frame = new RectangleF(23,185,275,210);

// Late Steve Jobs loved rounded corners. Let's have some respect for him
subView.Layer.CornerRadius = 10; 
subView.Layer.MasksToBounds = true;
subView.Layer.BorderColor = UIColor.Black.CGColor;
sheet.AddSubview(subView);

введите описание изображения здесь

person iLemming    schedule 22.11.2011
comment
Как это. Простой. Работает. Если кто-то хочет большего контроля, напишите свой собственный лист действий. Это не так сложно, но вашего решения достаточно для большинства случаев. - person Krumelur; 23.11.2011
comment
Это хакерство, но это неплохая вещь, поскольку альтернативой в любом случае будет более сложный взлом (т.е. такой же шанс взлома в будущем). Вы должны отметить свой вопрос как ответ, чтобы другие люди могли найти ваше решение, глядя на аналогичную проблему. - person poupou; 24.11.2011

UIActionSheet не поддерживает настройку этого типа. Вы можете создать подкласс UIActionSheet и использовать макет по умолчанию (переопределить layoutSubviews, вызвать суперреализацию, а затем переместить элементы). Если вы сделаете это, нет гарантии, что ваш подкласс будет работать в будущих версиях iOS, если Apple изменит реализацию фреймворка.

Другой альтернативой является поиск или реализация альтернативного класса, который будет делать то, что вы хотите.

person XJones    schedule 22.11.2011
comment
что значит не поддерживает? Я могу добавить подвид, почему я не могу исправить высоту листа? - person iLemming; 23.11.2011
comment
UIActionSheet имеет встроенное поведение для кнопок макета. У вас нет доступа к этой функции или, в частности, к каким-либо подпредставлениям UIActionSheet, кроме тех, которые предоставлены в общедоступной структуре. Все, что вы можете сделать, это добавить подпредставления, а затем попытаться изменить поведение по умолчанию постфактум, переопределив эти реализации, как я предложил. - person XJones; 23.11.2011
comment
Хорошо .. как насчет того: можно добавить кнопку с изображением, кнопку нестандартной высоты? - person iLemming; 23.11.2011
comment
Думаю, я могу добавить несколько фиктивных кнопок (чтобы зарезервировать место), а затем поверх них добавить свое подпредставление, которое создаст иллюзию. Кнопки были бы скрыты под ImageView ... Но я думаю, это был бы паршивый способ сделать это - person iLemming; 23.11.2011
comment
Вместо этого я бы попытался переопределить layoutSubview. Вам нужно будет пройтись по всем подпредставлениям в UIActionSheet, попытаться найти кнопки и переместить их вверх, чтобы освободить место для вашего imageView. Вам также может потребоваться отрегулировать фрейм UIActionSheet. Я не удивлюсь, если вы найдете какой-то опубликованный код для чего-то подобного, извините, я не знаю ни на что, чтобы указать вам. - person XJones; 23.11.2011
comment
Ничего страшного, я не рекомендовал это b / c. Мне не нравятся лишние кнопки, даже если вы их не видите. Никогда не знаешь, есть ли какой-то странный случай, когда они окажутся над вашим изображением, или пользователь может каким-то образом нажать на него. - person XJones; 23.11.2011
comment
вот почему вы должны скрыть их, установив альфа на ноль - person iLemming; 23.11.2011

На самом деле это довольно просто и вам не нужно взламывать:

Измените размер UIActionSheet ПОСЛЕ вызова showInView (или showFromTabBar и т. Д.), Как это делается в этом примере.

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

На iPad это, к сожалению, не работает. Но там вы можете использовать UIPopoverController. (Совет: вы можете использовать 0 для UIPopoverArrowDirection, если вам не нужны стрелки).

person Marcel W    schedule 17.07.2012

Это ответ Агзама, но обновленный для последнего objc и без хака фоновой кнопки, как предложил Марсель В., он короче и, возможно, чище.

 UIActionSheet *actionSheet = [[UIActionSheet alloc] init];
  actionSheet.actionSheetStyle = UIActionSheetStyleAutomatic;
  actionSheet.title = @"some text";//here type your information text
  actionSheet.delegate = self;

  [actionSheet addButtonWithTitle:@"Button 1"];
  [actionSheet addButtonWithTitle:@"Button 2"];
  [actionSheet setCancelButtonIndex:1];

//it is up to you how you show it, I like the tabbar
  [actionSheet showFromTabBar:self.tabBarController.tabBar];

//here lays the trick - you change the size after you've called show 
  [actionSheet setBounds:CGRectMake(0,0,320, 480)];

//now create and add your image
   UIImageView *subView = [[UIImageView alloc] initWithImage:[UIImage imageNamed:@"exampleimage.png"]];
   subView.ContentMode = UIViewContentModeScaleAspectFit;
   subView.Frame = CGRectMake(0,130,320,180);//adjust these, so that your text fits in
   [actionSheet addSubview: (subView)];
   [subView release];

  [actionSheet release];    
person drpawelo    schedule 31.07.2012