今日は、UIScrollViewをいじっています。これまでに自分でViewに追加した経験がないので、はっきり言って使い方がいまいち分かっていません。簡単なサンプルプログラムをつくりながら理解を深めていく計画です。
UIScrollViewを使って今回実現したいことは、スクロールして表示するコンテンツの外に余白をつくることです。このとき重要なプロパティが二つあります。ひとつはcontentSize、もう一つはcontentInsetです。
contentSizeは、UIScrollviewに表示したいコンテンツの大きさです。たとえば、500x500ピクセルの写真を表示する場合は、contentSizeを500x500に設定することになります。そして、contentInsetというのが、contentSizeの上や下にスクロール可能な領域を広めるために使うプロパティになります。
なので、UIScrollViewの外側に余白をつくるには、contentInsetを設定してやればそれでミッション完了です。
次のようにして設定します。
scrollView.contentInset=UIEdgeInsetsMake(50.0, 30.0, 44.0, 0);
これで、上に50.0、左に30.0、下に44.0、右に0の余白ができます。
しかし、このままだとスクロールビューの中での現在の表示位置を示すインジケータが余白部分も加味して表示されてしまいます。これが好ましくない場合は、scrollIndicatorInsetsを使って調整します。たとえば、こんな具合です。
scrollView.scrollIndicatorInsets=UIEdgeInsetsMake(50.0, 30.0, 44.0, 0);
こうしてやれば、余白部分を考慮せずに、コンテンツ内での位置をインジケータで示すことができます。多くの場合には、contentInsetとscrollIndicatorInsetsに同じ値を設定することで望ましい挙動が得られるのではないかと思われます。
2012-02-24
Ubuntu11.10のデスクトップをUnityからLinux Mintと同じcinnamonに変更
このページを参考にcinnamonを導入した。cinnamonは、最近Ubuntuに代わって人気のあるLinux Mintのデスクトップ環境らしい。
sudo add-apt-repository ppa:merlwiz79/cinnamon-ppa sudo apt-get update sudo apt-get install cinnamon cinnamon-session cinnamon-settingsで終わり。いったんログアウトしてからログインしなおせば、cinnamonを選択できる。 UbuntuのUnityというのは使いにくかったが、cinnamonは違和感なく使える。
JavaScriptでページのトップに滑らかにスクロールさせる
JavaScriptでページのトップにまでアニメーション付きで滑らかにスクロースするコードを書いてみました。特徴は、jQueryなどのライブラリを必要とせず、ほんの数行のプログラムだという点です。ちゃんとテストしていないから、動かないブラウザもあるかもしれません。
(function() {
var getScrollTop = function() {
return document.body.scrollTop || document.documentElement.scrollTop;
};
var getScrollLeft = function() {
return document.body.scrollLeft || document.documentElement.scrollLeft;
};
var startTime = new Date() - 0;
var scrollInterval = setInterval(function() {
var currTime = new Date() - startTime;
if (currTime > 500) {
clearInterval(scrollInterval);
scrollTo(0, 0);
}
else {
var x = getScrollLeft() * 3 / 4;
var y = getScrollTop() * 3 / 4;
scrollTo(x, y);
}
}, 30);
})();
なんでこんなコードを書いたかというと、AndroidのWebViewに滑らかにスクロールさせるメソッドが見つからなかったからです。scrollTo(int x, int y)だと一瞬でページのトップに来てしまいます。しかし、上のコードをJavaにそのまま移植すると、スレッドの関係で問題が生じる可能性がある気がします。そこらへんはまだ検証していません。
UIActionSheetのボタンをNSArrayで指定
iPhoneアプリの開発で、UIActionSheetを表示するとき項目を配列で指定したいことはよくあると思います。たとえば、iOS 5で追加されたTwitter APIを利用できるかによって、表示項目の数を動的に変更したい場合などです。
しかし不便なことに、initWithTitleのotherButtonTitlesには、配列を渡すことができません。
この問題に対処するためには、一度ボタンなしでUIActionSheetを初期化した後で、項目をaddButtonWithTitleで追加していくことになります。
ただしこのとき注意が必要なのは、初期化のときに、キャンセルボタンをつくってはいけないということです。他のボタンを追加した後でキャンセルボタンを指定しないと、iOS 4.xのバグでボタンのインデックスがメチャクチャになってしまい、actionSheet:clickedButtonAtIndex: の処理が正常に行えなくなります。(iOS 5では正常に動作するようです。)
だいたい次のようなコードになるかと思います。
しかし不便なことに、initWithTitleのotherButtonTitlesには、配列を渡すことができません。
この問題に対処するためには、一度ボタンなしでUIActionSheetを初期化した後で、項目をaddButtonWithTitleで追加していくことになります。
ただしこのとき注意が必要なのは、初期化のときに、キャンセルボタンをつくってはいけないということです。他のボタンを追加した後でキャンセルボタンを指定しないと、iOS 4.xのバグでボタンのインデックスがメチャクチャになってしまい、actionSheet:clickedButtonAtIndex: の処理が正常に行えなくなります。(iOS 5では正常に動作するようです。)
だいたい次のようなコードになるかと思います。
// ボタンなしで一度初期化する
UIActionSheet* sheet =[ [[UIActionSheet alloc] initWithTitle:NSLocalizedString(@"ActionSheetTitle", nil) delegate:self cancelButtonTitle:nil destructiveButtonTitle:nil otherButtonTitles:nil] autorelease];
// ボタンを追加
NSArray* buttonTitleArray = [MyButtons array];
for (NSString* buttonTitle in buttonTitleArray) {
[sheet addButtonWithTitle:buttonTitle];
}
// 古いiOSには、キャンセルボタンも後から追加しないインデクスが狂うバグがある
sheet.cancelButtonIndex = [sheet addButtonWithTitle:NSLocalizedString(@"Cancel", nil)];
SyntaxHighliterをBloggerに導入
プログラムコードを表示するために、SyntaxHighliterを導入しています。SyntaxHighliterをブロガーに簡単にインストールできるように、下記のスクリプトを作成して埋め込んでいます。これをHTML/JavaScriptガジェットにコピペすれば導入完了です。(SyntaxHighliterの使い方の詳細については作者Webページを参照してください。)
<script src="http://alexgorbatchev.com/pub/sh/3.0.83/scripts/shCore.js" type="text/javascript"></script>
<script src="http://alexgorbatchev.com/pub/sh/3.0.83/scripts/shAutoloader.js" type="text/javascript"></script>
<script type="text/javascript">
(function() {
var loadCssFile = function(href) {
var link = document.createElement("link");
link.rel = "stylesheet";
link.href = href;
link.type = "text/css"
document.getElementsByTagName('head')[0].appendChild(link);
};
loadCssFile("http://alexgorbatchev.com/pub/sh/3.0.83/styles/shThemeEclipse.css");
loadCssFile("http://alexgorbatchev.com/pub/sh/3.0.83/styles/shCore.css");
SyntaxHighlighter.autoloader(
'applescript http://alexgorbatchev.com/pub/sh/3.0.83/scripts/shBrushAppleScript.js',
'actionscript3 as3 http://alexgorbatchev.com/pub/sh/3.0.83/scripts/shBrushAS3.js',
'bash shell http://alexgorbatchev.com/pub/sh/3.0.83/scripts/shBrushBash.js',
'coldfusion cf http://alexgorbatchev.com/pub/sh/3.0.83/scripts/shBrushColdFusion.js',
'cpp c http://alexgorbatchev.com/pub/sh/3.0.83/scripts/shBrushCpp.js',
'c# c-sharp csharp cs http://alexgorbatchev.com/pub/sh/3.0.83/scripts/shBrushCSharp.js',
'css http://alexgorbatchev.com/pub/sh/3.0.83/scripts/shBrushCss.js',
'delphi pascal http://alexgorbatchev.com/pub/sh/3.0.83/scripts/shBrushDelphi.js',
'diff patch pas http://alexgorbatchev.com/pub/sh/3.0.83/scripts/shBrushDiff.js',
'erl erlang http://alexgorbatchev.com/pub/sh/3.0.83/scripts/shBrushErlang.js',
'groovy http://alexgorbatchev.com/pub/sh/3.0.83/scripts/shBrushGroovy.js',
'java http://alexgorbatchev.com/pub/sh/3.0.83/scripts/shBrushJava.js',
'jfx javafx http://alexgorbatchev.com/pub/sh/3.0.83/scripts/shBrushJavaFX.js',
'js jscript javascript http://alexgorbatchev.com/pub/sh/3.0.83/scripts/shBrushJScript.js',
'perl pl http://alexgorbatchev.com/pub/sh/3.0.83/scripts/shBrushPerl.js',
'php http://alexgorbatchev.com/pub/sh/3.0.83/scripts/shBrushPhp.js',
'text plain http://alexgorbatchev.com/pub/sh/3.0.83/scripts/shBrushPlain.js',
'py python http://alexgorbatchev.com/pub/sh/3.0.83/scripts/shBrushPython.js',
'ruby rails ror rb http://alexgorbatchev.com/pub/sh/3.0.83/scripts/shBrushRuby.js',
'sass scss http://alexgorbatchev.com/pub/sh/3.0.83/scripts/shBrushSass.js',
'scala http://alexgorbatchev.com/pub/sh/3.0.83/scripts/shBrushScala.js',
'sql http://alexgorbatchev.com/pub/sh/3.0.83/scripts/shBrushSql.js',
'vb vbnet http://alexgorbatchev.com/pub/sh/3.0.83/scripts/shBrushVb.js',
'xml xhtml xslt html http://alexgorbatchev.com/pub/sh/3.0.83/scripts/shBrushXml.js'
);
SyntaxHighlighter.config.stripBrs = true;
SyntaxHighlighter.config.bloggerMode = true;
SyntaxHighlighter.defaults.toolbar = false;
SyntaxHighlighter.all();
})();
</script>
2012-01-16
iPhoneのUIWebViewにSafariみたいなアドレスバーをつける
iPhoneで、Safariに付いているようなページ読み込みが終わったら自動的に隠れるアドレスバーを実装する方法を書いてある記事を見つけた。まだ試していないがこれは役に立ちそう。
2011-11-23
Android端末でJQuery Mobileのページ幅が正しく計算されない
JQuery MobileでつくったページにFacebookのJavaScript SDKを組み込む場合は、Androidのブラウザで画面の向き(Screen Orientation)を変えると、ページ幅が正しく調整されないことがあるので注意したい。
画面を横にしたときに広がったページ幅が、縦に戻しても元に戻らないのだ。この現象は、JQuery Mobileの1.0 RC2でも1.0 finalでも起こる。
どうやらbodyタグの中にscriptタグがあることが、この問題の原因となっているようだ。 <script style="width:0px;">とやったら、多くの場合にこの現象を防ぐことができることを確認した。ただ、完全に防ぐことに成功したわけではなく、たまにページ幅が正しく調整されないこともある。
画面を横にしたときに広がったページ幅が、縦に戻しても元に戻らないのだ。この現象は、JQuery Mobileの1.0 RC2でも1.0 finalでも起こる。
どうやらbodyタグの中にscriptタグがあることが、この問題の原因となっているようだ。 <script style="width:0px;">とやったら、多くの場合にこの現象を防ぐことができることを確認した。ただ、完全に防ぐことに成功したわけではなく、たまにページ幅が正しく調整されないこともある。
登録:
投稿 (Atom)