ScrollView with scroll’s indicators, which are shown all the time.

UPDATE: This solution could cause some issues on iOS 7. For more detail look .

My simple solution by writing category for UIImageView, because scroller is imageview.

How to use :)
Just setup tag for your scrollview and you will get one with scroll indicators, which are shown all the time.

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
#define noDisableVerticalScrollTag 836913
#define noDisableHorizontalScrollTag 836914

@implementation UIImageView (ForScrollView)

- (void) setAlpha:(float)alpha {
   
    if (self.superview.tag == noDisableVerticalScrollTag) {
        if (alpha == 0 && self.autoresizingMask == UIViewAutoresizingFlexibleLeftMargin) {
            if (self.frame.size.width < 10 && self.frame.size.height > self.frame.size.width) {
                UIScrollView *sc = (UIScrollView*)self.superview;
                if (sc.frame.size.height < sc.contentSize.height) {
                    return;
                }
            }
        }
    }
   
    if (self.superview.tag == noDisableHorizontalScrollTag) {
        if (alpha == 0 && self.autoresizingMask == UIViewAutoresizingFlexibleTopMargin) {
            if (self.frame.size.height < 10 && self.frame.size.height < self.frame.size.width) {
                UIScrollView *sc = (UIScrollView*)self.superview;
                if (sc.frame.size.width < sc.contentSize.width) {
                    return;
                }
            }
        }
    }
   
    [super setAlpha:alpha];
}
@end

If you want both scroll it’s easy to change code.

Simple EKDemo – EKEvent

Now we have controller for creating events. This controller included from 4.0 iOS SDK.

SimpleEKDemo

The application uses table views to display EKCalendar object and EKEvent objects retrieved from an EKEventStore object. It implements EKEventViewController for viewing and editing existing EKEvents, and uses EKEventEditViewController for creating new EKEvents.

Основы Grand Central Dispatch

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

Что это?

Grand Central Dispatch, или, ко­рот­ко, GCD — это низ­ко­уров­не­вое API, ко­то­рая от­кры­ва­ет но­вый спо­соб ра­бо­тать с па­рал­лель­ны­ми (ори­ги­наль­но это concurrent, а не parallel, я не знаю нор­маль­но­го пе­ре­во­да, ес­ли кто ска­жет — на­пи­ши­те в ком­мен­та­ри­ях, прим. пер.) про­грам­ма­ми. На са­мом про­стом уровне по­ни­ма­ния, ме­то­до­ло­гия по­хо­жа на NSOperationQueue, ко­то­рая поз­во­ля­ет раз­би­вать про­грам­му на неза­ви­си­мые за­да­чи, ко­то­рые за­пус­кать па­рал­лель­но или по­сле­до­ва­тель­но. GCD ра­бо­та­ет на бо­лее низ­ком уровне, предо­став­ля­ет боль­шую про­из­во­ди­тель­ность и не яв­ля­ет­ся ча­стью Cocoa.

В до­пол­не­ние к сред­ствам па­рал­лель­но­го вы­пол­не­ния ко­да, GCD та­к­же предо­став­ля­ет пол­но­стью ин­те­гри­ро­ван­ную си­сте­му об­ра­бот­ки со­бы­тий. Об­ра­бот­чи­ки мо­гут быть скон­фи­гу­ри­ро­ва­ны та­ким об­ра­зом, что­бы ре­а­ги­ро­вать на со­бы­тия от фай­ло­вых де­скрип­то­ров, си­стем­ных пор­тов и про­цес­сов, тай­ме­ров и сиг­на­лов, и на поль­зо­ва­тель­ские со­бы­тия. Эти об­ра­бот­чи­ки ис­пол­ня­ют­ся па­рал­лель­но при по­мо­щи ин­фра­струк­ту­ры GCD.

API GCD пол­но­стью ос­но­ван на так на­зы­ва­е­мых бло­ках, о ко­то­рых я го­во­рил в преды­ду­щих се­ри­ях от­ве­тов на во­про­сы («Поз­воль­те пред­ста­вить»: бло­ки и «Об­суж­де­ние прак­ти­че­ских ас­пек­тов ис­поль­зо­ва­ния бло­ков в обыч­ном ко­де»). GCD мож­но ис­поль­зо­вать и без бло­ков, при­ме­няя тра­ди­ци­он­ные C-​шные ме­ха­низ­мы ука­за­те­лей на функ­ции и кон­тек­ста, но ис­поль­зо­вать бло­ки го­раз­до про­ще и неве­ро­ят­но удоб­нее с прак­ти­че­ской точ­ки зре­ния.

Для по­лу­че­ния си­стем­ной до­ку­мен­та­ции по GCD, мож­но на­брать man dispatch в ко­манд­ной стро­ке, ес­ли у вас Snow Leopard. Continue reading

Adding SVN revision to Xcode project

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

Чтоб отслеживать версию репозитория нам нужно добавить слдеющий код bash скрипта.

1
2
3
4
5
6
7
8
9
10
REVISION=`svnversion -nc | /usr/bin/sed -e 's/^[^:]*://;s/[A-Za-z]//'`
APPVERSION=`/usr/libexec/PlistBuddy -c "Print CFBundleVersion" "${TARGET_BUILD_DIR}"/${INFOPLIST_PATH}`

xported="xported"

if [ $APPVERSION != $xported ]; then
     /usr/libexec/PlistBuddy -c "Delete :CFBundleDisplayVersion" "${TARGET_BUILD_DIR}"/${INFOPLIST_PATH}
     /usr/libexec/PlistBuddy -c "Add :CFBundleDisplayVersion string" "${TARGET_BUILD_DIR}"/${INFOPLIST_PATH}
     /usr/libexec/PlistBuddy -c "Set :CFBundleDisplayVersion $APPVERSION.$REVISION" "${TARGET_BUILD_DIR}"/${INFOPLIST_PATH}
fi

Чтоб добавить скрипт, необходимо выполнить следующие действия:
1. Зажать Ctrl+клик на фаил проекта в дереве проекта
2. Add->New Build Phase -> New Run Script Build Phase
3. Откроется окно в которое нужно вставить скрипт.

Continue reading

Keychain

Это только часть статьи, скопировал с habrahabr.ru. Добавил для себя, но может кому-то пригодится тоже. Спасибо автору youROCK.

Функции для работы с Keychain достаточно низкоуровневые (в отличие от большинства фреймворков, которые работают с пользовательским интерфейсом), и используют API на языке C. В документации от Apple есть очень объемное руководство по всем вызовам, которые поддерживаются подсистемой Keychain Services, но я бы хотел показать, насколько просто можно делать базовые вещи.

При работе с вызовами на языке C, Apple в основном использует CoreFoundation. CoreFoundation использует и поддерживает практически те же самые типы данных, которые используются в Objective C с фреймворком Cocoa, и даже поддерживает прозрачное приведение типов CoreFoundation < -> Cocoa. Все вызовы CoreFoundation имеют префикс CF (ср. с NS), а имена типов получаются с помощью замены NS на CF и звездочки [*] на суффикс Ref (reference, ссылка) в конец (к примеру, NSString* < -> CFStringRef, NSArray* < -> CFArrayRef). Для работы с памятью используются CFRelease(CFTypeRef) / CFRetain(CFTypeRef), о назначении и способе использования которых можете догадаться сами.
Continue reading

iPad TV ad

Новая реклама iPad. В рекламе есть приложение созданное нашей командой :)

Restoring playlists from iPhone/iPad for iTunes

Возникла проблема после обновления Mac OS X и iTunes. Поломалась база iTunes и плейлисты были утеряны.

Но часть плейлистов осталась на iPhone! И их то мы и востановим.

Continue reading

1 2 3 Next »