как создать колеблющийся эффект значка iPhone?

Вам не нужно использовать условие if/else, чтобы сделать это, вы можете использовать несколько шаблонов, один будет соответствовать строкам журнала API, а другой будет соответствовать строкам журнала WEB.

Для строк журнала API вы можете использовать следующий шаблон:

(?:%{TIME:CREATED_ON})(?:%{SPACE})%{WORD:LEVEL}%{SPACE}\[%{NOTSPACE}\]%{SPACE}\(%{NOTSPACE:THREAD}\)%{SPACE}(?:%{DATA})%{SPACE}\[%{DATA}\]%{SPACE}%{WORD}%{SPACE}%{GREEDYDATA:MSG}

И ваш возврат будет примерно таким:

{
"MSG": "c.r.s.web.controller.LoginController - Inside initLoginPage() of LoginController",
"CREATED_ON": "00:06:27,899",
"LEVEL": "INFO",
"THREAD": "ajp--0.0.0.0-8009-40"
}

Для В веб-строках вы можете использовать следующий шаблон:

(?:%{TIME:CREATED_ON})(?:%{SPACE})%{WORD:LEVEL}%{SPACE}\[%{NOTSPACE}\]%{SPACE}\(%{NOTSPACE:THREAD}\)%{SPACE}%{DATA}%{WORD:PROTOCOL}%{SPACE}%{WORD:MethodOrStatus}%{SPACE}%{GREEDYDATA:ENDPOINT}

И результат будет:

{
"CREATED_ON": "00:06:27,783",
"PROTOCOL": "HTTP",
"ENDPOINT": "http://api.survey.me/v1/getwidgetdetails?profileName=jeremy-steffens&profileLevel=INDIVIDUAL&companyProfileName=premier-nationwide-lending&hideHistory=true",
"LEVEL": "INFO",
"THREAD": "ajp--0.0.0.0-8009-38",
"MethodOrStatus": "GET"
}

Чтобы использовать несколько шаблонов в Grok, просто сделайте это: [ 1115]

grok {
  match => ["message", "pattern1", "pattern2"]
}

Или вы можете сохранить свои шаблоны в файл и использовать patterns_dir, чтобы указать на каталог файла.

Если вы все еще хотите использовать условное выражение, просто проверьте что-нибудь в сообщении, например:

if "HTTP" in [message] { 
 grok { your grok for the web messages }
} else {
 grok { your grok for the api messages }
}
52
задан Pieter 28 May 2013 в 20:55
поделиться

3 ответа

Простой способ сделать это:

#define RADIANS(degrees) (((degrees) * M_PI) / 180.0)

CGAffineTransform leftWobble = CGAffineTransformRotate(CGAffineTransformIdentity, RADIANS(-5.0));
CGAffineTransform rightWobble = CGAffineTransformRotate(CGAffineTransformIdentity, RADIANS(5.0));

itemView.transform = leftWobble;  // starting point

[UIView beginAnimations:@"wobble" context:itemView];
[UIView setAnimationRepeatAutoreverses:YES]; // important
[UIView setAnimationRepeatCount:10];
[UIView setAnimationDuration:0.25];
[UIView setAnimationDelegate:self];
[UIView setAnimationDidStopSelector:@selector(wobbleEnded:finished:context:)];

itemView.transform = rightWobble; // end here & auto-reverse

[UIView commitAnimations];

...

- (void) wobbleEnded:(NSString *)animationID finished:(NSNumber *)finished context:(void *)context 
{
     if ([finished boolValue]) {
        UIView* item = (UIView *)context;
        item.transform = CGAffineTransformIdentity;
     }
}

Вероятно, придется поиграть с таймингом и углами, но это должно помочь вам начать.

РЕДАКТИРОВАТЬ: Я отредактировал ответ, добавив код для размещения элемента вернувшись в исходное состояние, когда закончите. Также обратите внимание, что вы можете использовать значение контекста beginAnimations для передачи чего-либо методам запуска / остановки. В данном случае это сам качающийся объект, поэтому вам не нужно полагаться на определенные ivars, и этот метод можно использовать для любого общего объекта на основе UIView (например, текстовых меток, изображений и т. Д.)

92
ответ дан 7 November 2019 в 08:57
поделиться

из вышеупомянутых ответов я получил swift5 версию:

  func startWobble() {
    let angle = 5.0 * Double.pi / 180.0;
    self.transform = CGAffineTransform.identity.rotated(by: CGFloat(-angle));
    UIView.animate(withDuration: 0.25, delay: 0, options: [.allowUserInteraction,.repeat,.autoreverse], animations: {
         self.transform = CGAffineTransform.identity.rotated(by: CGFloat(angle));
    }, completion: nil)

}

func stopWobble() {

    UIView.animate(withDuration: 0.25, delay: 0, options: [.allowUserInteraction,.beginFromCurrentState,.curveLinear], animations: {
        self.transform = CGAffineTransform.identity;
    }, completion: nil)
}
0
ответ дан 7 November 2019 в 08:57
поделиться

Самый простой из известных мне способов - использовать Core Animation. По сути, вы создаете основной блок анимации, затем выполняете преобразование вращения, настройку и счетчик повторов. Затем Core Animation позаботится обо всем, что необходимо для создания этого эффекта колебания.

Чтобы запустить блок Core Animation, просто выполните:

[UIView beginAnimations:@"any string as animationID" context:self];
[UIView setAnimationRepeatCount:10];
// rotate 
[UIView commitAnimations];

не проверено. Но может случиться так, что вам также придется сделать:

[UIView setAnimationBeginsFromCurrentState:YES];

AFAIK setAnimationRepeatCount будет иметь эффект, что анимация выполняется, отменяется, выполняется, отменяется, выполняется, отменяется, выполняется ... столько раз, сколько вы укажете. Таким образом, вы можете сначала повернуть влево без подсчета повторов, а затем с этого момента начать качание с подсчетом повторов. Когда закончите, вы можете захотеть вернуться к преобразованию идентичности (= без вращения и масштабирования).

Вы можете объединить анимации в цепочку, установив делегату анимации с помощью

[UIView setAnimationDelegate:self]

, а затем

[UIView setAnimationDidStopSelector:@selector(myMethod:finished:context:)];

, и как только анимация остановится, этот метод будет вызван. См. Документацию класса UIView, чтобы узнать, как реализовать этот метод, который будет вызываться при остановке анимации. По сути, внутри этого метода вы должны выполнить следующий шаг (то есть обратный поворот или что-то еще) с новым блоком анимации, но с тем же контекстом и идентификатором анимации, а затем (при необходимости) указать другой didStopSelector.

ОБНОВЛЕНИЕ:

Вы можете проверить:

[UIView setAnimationRepeatAutoreverses:YES];

он будет качаться вперед и назад автоматически.

2
ответ дан 7 November 2019 в 08:57
поделиться
Другие вопросы по тегам:

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