UIActivityViewController удаляет избыточное пространство при совместном использовании с сообщениями

У меня есть аналогичный код в моем проекте, и я получаю избыточное пространство между элементами общего доступа. Можно ли его удалить?

let text = "Some text\n"
let link = NSURL(string: "http://stackoverflow.com/")!

let items = [text, link]
let activityVC = UIActivityViewController(activityItems: items, applicationActivities: nil)

self.presentViewController(activityVC, animated: true, completion: nil)

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


person ChikabuZ    schedule 13.09.2015    source источник
comment
Где опять пустота?   -  person gran_profaci    schedule 16.09.2015
comment
В начале URL.   -  person ChikabuZ    schedule 16.09.2015
comment
Почему вы добавляете \n в конце текста? Без символа ссылка также начинается со следующей строки в моем устройстве.   -  person KudoCC    schedule 16.09.2015
comment
Если я удалю \n, в одной строке будет [текст][пробел][ссылка]. Мне нужно убрать пробел.   -  person ChikabuZ    schedule 16.09.2015


Ответы (4)


Используйте NSString вместо NSURL в соответствии с приведенным ниже кодом:

NSString *text = @"Some Text";
NSString *URL = @"\nhttp://www.apple.com";
UIActivityViewController *controller = [[UIActivityViewController alloc] initWithActivityItems:@[text, URL] applicationActivities:nil];

[self presentViewController:controller animated:YES completion:nil];

------------------- Код Swift (согласно вопросу) -------------

let text = "Some text"
let link = "\nhttp://stackoverflow.com/"

let items = [text, link]
let activityVC = UIActivityViewController(activityItems: items, applicationActivities: nil)

self.presentViewController(activityVC, animated: true, completion: nil)

Вы можете увидеть прикрепленные скриншоты. После того, как вы опубликуете/отправите сообщение, оно все равно будет отображаться как ссылка.

URL-адрес добавляет пробел по умолчанию, если URL-адрес не является первым объектом в массиве элементов активности.

Надеюсь это поможет.

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

person Dharmesh Siddhpura    schedule 16.09.2015
comment
В моем случае это выглядит так: if activityType == UIActivityTypeMessage { return \n + url.absoluteString! } - person ChikabuZ; 16.09.2015
comment
@Dharmesh Чтобы ответить на ваш вопрос, после окончания вознаграждения есть 24-часовой льготный период. Если вознаграждение не было назначено вручную в конце льготного периода, оно присуждается за принятый ответ или, в противном случае, за наибольшее количество голосов (ничьи разорваны самым ранним опубликованным временем) - person Bohemian♦; 24.09.2015

Обновление: вот комплексное решение. Кажется, что только "Сообщение" не работает, поэтому я использую два объекта активности, чтобы обойти это.

Вы должны создать два класса, которые соответствуют протоколу UIActivityItemSource. Я не знаком с Swift, поэтому они реализованы с помощью Objective-C, я думаю, вы понимаете.

1 ActivityObject класс

@interface ActivityObject : NSObject

@end

@implementation ActivityObject

- (id)activityViewControllerPlaceholderItem:(UIActivityViewController *)activityViewController {
    return @"some Text";
}

- (id)activityViewController:(UIActivityViewController *)activityViewController itemForActivityType:(NSString *)activityType {
    if ([activityType isEqualToString:@"com.apple.UIKit.activity.Message"]) {
        return @"Some text\nhttp://stackoverflow.com/";
    } else {
        return @"Some text";
    }
}
@end

2 ActivityObjectURL класс

@interface ActivityObjectURL : NSObject

@end

@implementation ActivityObjectURL

- (id)activityViewControllerPlaceholderItem:(UIActivityViewController *)activityViewController {
    return @"";
}

- (id)activityViewController:(UIActivityViewController *)activityViewController itemForActivityType:(NSString *)activityType {
    if ([activityType isEqualToString:@"com.apple.UIKit.activity.Message"]) {
        return @"";
    } else {
        return [NSURL URLWithString:@"http://stackoverflow.com"];
    }
}

@end

Тогда используйте их так.

ActivityObject *o = [[ActivityObject alloc] init];
ActivityObjectURL *ol = [[ActivityObjectURL alloc] init];
UIActivityViewController *avc = [[UIActivityViewController alloc] initWithActivityItems:@[o, ol] applicationActivities:nil];
[self presentViewController:avc animated:YES completion:nil];

Решение @dsiddhpura добавит нечетный разрыв строки в почтовое приложение.

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

person KudoCC    schedule 16.09.2015
comment
Да, это будет работать, но не будет работать, например, в твиттере, я ищу универсальное решение. - person ChikabuZ; 16.09.2015
comment
Универсального решения нет. Если вы объявите объект NSURL, всегда будет место, так как это предоставлено платформой iOS. Если вы поместите URL-адрес как часть строки, URL-адрес будет текстовым и, следовательно, не будет распознан. Только исключение из этого, если принимающее приложение анализирует текст прямо или косвенно. Директ должен быть четким. Косвенный означает UITextField или UIWebView с активированным обнаружением ссылки. - person Helge Becker; 16.09.2015
comment
Спасибо, жду, может есть еще лучший ответ. - person ChikabuZ; 16.09.2015

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

    let text = "Some text"
    let text2 = "ABC text"
    let text3 = "DEF text"
    let link = NSURL(string: "http://stackoverflow.com/")!

    let items = [text, text2, text3, link]
    let activityVC = UIActivityViewController(activityItems: items, applicationActivities: nil)

    self.presentViewController(activityVC, animated: true, completion: nil)
  1. Когда выберите «Копировать», а затем вставьте его, я получил: Some text ABC text DEF text http://stackoverflow.com/

  2. Когда я выбираю поделиться через сообщение, я получаю Some text ABC text DEF text http://stackoverflow.com/

что является правильным поведением (по умолчанию). Кстати, изменить это поведение по умолчанию невозможно.

Если вы все еще хотите это сделать, измените формат текста, как предложил @KudoCC, или создайте собственный UIActivity — единственный выбор.

Удачи

person Ducky    schedule 16.09.2015
comment
Если вы поделитесь в сообщениях, будут пробелы. - person ChikabuZ; 16.09.2015

Попытайся.

let text = "Some text"
let link = NSURL(string: "\nhttp://stackoverflow.com/")!
let items = [text, link]
let activityVC = UIActivityViewController(activityItems: items, applicationActivities: nil)
self.presentViewController(activityVC, animated: true, completion: nil)
person Sankalap Yaduraj Singh    schedule 18.09.2015