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

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

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

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 и листа. Не сработало Что я делаю неправильно?

Изображение должно помещаться между кнопками или как-то умещаться на листе любым другим способом

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);

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

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

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

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

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

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

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

 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];    
Другие вопросы по тегам